Usando sed per convertire newline in spazi


22

Supponiamo di avere una variabile shell $stringche contiene del testo con diverse nuove righe, ad esempio:

string="this
is 
a test"

Vorrei convertire questa stringa in una nuova stringa in new_stringcui tutte le interruzioni di riga vengono convertite in spazi:

new_string="this is a test"

Provai:

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

ma non ha funzionato

Mi chiedo anche se c'è un modo per farlo usando perl -0777 's/\n/ /g'o forse il comando tr?


Risposte:


32

Se si desidera rimuovere solo le nuove righe nella stringa, non è necessario utilizzarle sed. Puoi usare solo

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

come altri avevano indicato.

Ma se vuoi convertire nuove linee in spazi su un file usando sed, allora puoi usare:

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

o anche awk:

$ awk '$1=$1' ORS=' ' file_with_line_breaks > new_file_with_spaces

1
spongeè un'utilità utile per sovrascrivere un file di input. Fa parte del pacchetto moreutils... ad es. awk '$1=$1' ORS=' ' file |sponge file
Peter

@ferer Grazie per l'informazione. Installazione moreutils...
pferor


4

Un'altra opzione sarebbe quella di utilizzare xargs(che, inoltre, comprime più spazi bianchi):

string="this
    is 
a    test"

printf "$string" | xargs   # this is a test

3

L'eco ignora gli spazi bianchi, quindi dovrebbe funzionare:

new_string=`echo $string`

Sì, funzionerà, ma forse troppo bene. Comprime più spazi bianchi in un unico spazio. Ciò include la conversione di schede in spazi.
Peter,

3

Se hai già la stringa come una variabile bash, come tuo esempio spettacoli, è inutile e uno spreco di risorse (e più battitura) per chiamare sed, awk, printf, ecc ... Si può semplicemente utilizzare l'espansione variabile bash :

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

Non è nemmeno necessario riassegnarlo. È possibile utilizzare l'espansione così com'è e lasciare $stringinvariato.

printf "${string//$'\n'/ }" >file

3

Potresti provare anche questo comando awk,

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

Esempio:

$ (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"

Questo converte qualsiasi sequenza di uno o più \ncaratteri di ewline presenti nella variabile shell $stringin un singolo <space>.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.