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.


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

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


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

3

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

new_string=`echo $string`

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

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.

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>.


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.