Usando sed para converter novas linhas em espaços

22

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

string="this
is 
a test"

Gostaria de converter essa string em uma nova string, new_stringonde 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?

Amelio Vazquez-Reina
fonte

Respostas:

32

Se você deseja remover apenas as novas linhas da string, não precisa usá-lo sed. Você pode usar apenas

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

como outros haviam apontado.

Mas se você quiser converter novas linhas em espaços em um arquivo usando sed, poderá 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
pferor
fonte
1
spongeé um utilitário útil para substituir um arquivo de entrada. Faz parte do pacote moreutils... por exemplo. awk '$1=$1' ORS=' ' file |sponge file
Peter.O
@ferer Obrigado pela informação. Instalando moreutils...
pferor
5

Você pode tentar usar tr:

echo "$string" | tr '\n' ' '
Mark McKinstry
fonte
4

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

string="this
    is 
a    test"

printf "$string" | xargs   # this is a test
user57553
fonte
3

O eco ignora o espaço em branco, portanto deve funcionar:

new_string=`echo $string`
Kevin
fonte
Sim, vai funcionar, mas talvez muito bem. Recolherá vários espaços em branco em um único espaço. Isso inclui a conversão de TABs em espaços.
Peter.O
3

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

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

Você nem precisa redesigná-lo. Você pode usar a expansão como está e deixar $stringinalterada.

printf "${string//$'\n'/ }" >file
Peter.O
fonte
3

Você também pode tentar este comando awk,

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.
Avinash Raj
fonte
1
state=$(set +o)
set -f ; IFS='
'; set -- $string
unset IFS; string="$*"
eval "$state"

Isso converte qualquer sequência de um ou mais \ncaracteres ewline que ocorrem na variável do shell $stringem uma única <space>.

mikeserv
fonte
0

Você pode usar o comando sed simples

 $-sed ':loop;N;s/\n/ /g;t loop'
Kalanidhi M.
fonte