Usando sed para convertir nuevas líneas en espacios

22

Digamos que tengo una variable de shell $stringque contiene texto con varias líneas nuevas, por ejemplo:

string="this
is 
a test"

Me gustaría convertir esta cadena en una nueva cadena new_stringdonde todos los saltos de línea se convierten en espacios:

new_string="this is a test"

Lo intenté:

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

pero no funcionó

También me pregunto si hay una manera de hacer esto usando perl -0777 's/\n/ /g'o tal vez el comando tr.

Amelio Vazquez-Reina
fuente

Respuestas:

32

Si solo desea eliminar las nuevas líneas en la cadena, no necesita usarlas sed. Puedes usar solo

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

como otros lo habían señalado.

Pero si desea convertir nuevas líneas en espacios en un archivo usando sed, entonces puede usar:

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

o incluso awk:

$ awk '$1=$1' ORS=' ' file_with_line_breaks > new_file_with_spaces
pferor
fuente
1
spongees una utilidad útil para sobrescribir un archivo de entrada. Es parte del paquete moreutils... por ejemplo. awk '$1=$1' ORS=' ' file |sponge file
Peter.O
@ferer Gracias por la información. Instalando moreutils...
pferor
5

Puedes intentar usar en su trlugar:

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

Otra opción sería usar xargs(que, además, exprime múltiples espacios en blanco):

string="this
    is 
a    test"

printf "$string" | xargs   # this is a test
usuario57553
fuente
3

Echo ignora los espacios en blanco, por lo que debería funcionar:

new_string=`echo $string`
Kevin
fuente
Sí, funcionará, pero quizás demasiado bien. Colapsará múltiples espacios en blanco en un solo espacio. Eso incluye convertir TAB a espacios.
Peter
3

Si ya tiene la cadena como una variable de bash, como su ejemplo muestra, es inútil y un desperdicio de recursos (y más a escribir) para llamar sed, awk, printf, etc ... Se puede utilizar sólo la expansión de variables fiesta :

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

Ni siquiera tiene que reasignarlo. Puede usar la expansión tal cual y dejarla $stringsin cambios.

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

También puedes probar este comando awk,

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

Ejemplo:

$ (echo This; echo is; echo a; echo test.) | awk -v RS="" '{gsub (/\n/," ")}1'
This is a test.
Avinash Raj
fuente
1
state=$(set +o)
set -f ; IFS='
'; set -- $string
unset IFS; string="$*"
eval "$state"

Esto convierte cualquier secuencia de uno o más \ncaracteres ewline que ocurran en la variable de shell $stringen una sola <space>.

mikeserv
fuente
0

Puedes usar el simple comando sed

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