Usando sed para converter novas linhas em espaços

22

Digamos que eu tenha uma variável de shell $string que contém algum texto com várias novas linhas, por exemplo:

string="this
is 
a test"

Eu gostaria de converter essa string em uma nova string new_string , onde todas as quebras de linha são convertidas em espaços:

new_string="this is a test"

Eu tentei:

print $string | sed 's/\n/ /g'

mas não funcionou

Também estou querendo saber se existe uma maneira de fazer isso usando perl -0777 's/\n/ /g' ou talvez o comando tr ?

    
por Amelio Vazquez-Reina 14.12.2011 / 01:42

8 respostas

30

Se você quiser remover apenas as novas linhas da string, não será necessário usar sed . Você pode usar apenas

$  echo "$string" | tr '\n' ' '

como outros apontaram.

Mas se você quiser converter novas linhas em espaços em um arquivo usando sed , então você pode usar:

$ sed -i ':a;N;$!ba;s/\n/\t/g' file_with_line_breaks

ou até awk :

$ awk '$1=$1' ORS=' ' file_with_line_breaks > new_file_with_spaces
    
por 14.12.2011 / 04:14
5

Você pode tentar usar tr :

echo "$string" | tr '\n' ' '
    
por 14.12.2011 / 03:15
4

Ainda outra opção seria usar xargs (que, além disso, aperta vários espaços em branco):

string="this
    is 
a    test"

printf "$string" | xargs   # this is a test
    
por 24.01.2014 / 13:51
3

O echo ignora o espaço em branco, por isso deve funcionar:

new_string='echo $string'
    
por 14.12.2011 / 02:36
3

Você pode tentar este comando awk também,

awk -v RS="" '{gsub (/\n/," ")}1' file

Exemplo:

$ (echo This; echo is; echo a; echo test.) | awk -v RS="" '{gsub (/\n/," ")}1'
This is a test.
    
por 31.05.2014 / 14:43
2

Se você já tiver a string como uma variável bash, como mostra o seu exemplo, é inútil e desperdício de recursos (e mais digitação) chamar sed , awk , printf , etc ... Você pode apenas usar expansão da variável bash :

string="${string//$'\n'/ }"

Você nem precisa reatribuí-lo. Você pode usar a expansão como está e deixar $string inalterado.

printf "${string//$'\n'/ }" >file
    
por 14.12.2011 / 07:00
1
state=$(set +o)
set -f ; IFS='
'; set -- $string
unset IFS; string="$*"
eval "$state"

Isso converte qualquer sequência de um ou mais caracteres% e_line \n ocorrendo na variável de shell $string em um único <space> .

    
por 05.08.2014 / 21:57
0

Você pode usar o comando simples sed -

 $-sed ':loop;N;s/\n/ /g;t loop'
    
por 31.05.2014 / 13:26

Tags