Verwenden von sed, um Zeilenumbrüche in Leerzeichen umzuwandeln

22

$stringAngenommen, ich habe eine Shell-Variable , die Text mit mehreren Zeilenumbrüchen enthält, z.

string="this
is 
a test"

Ich möchte diese Zeichenfolge in eine neue Zeichenfolge new_stringkonvertieren, in der alle Zeilenumbrüche in Leerzeichen umgewandelt werden:

new_string="this is a test"

Ich habe es versucht:

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

aber es hat nicht funktioniert

Ich frage mich auch, ob es eine Möglichkeit gibt, dies mit perl -0777 's/\n/ /g'oder vielleicht mit dem Befehl zu tun tr.

Amelio Vazquez-Reina
quelle

Antworten:

32

Wenn Sie nur die neuen Zeilen in der Zeichenfolge entfernen möchten, müssen Sie nicht verwenden sed. Sie können nur verwenden

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

wie andere gezeigt hatten.

Wenn Sie jedoch neue Zeilen mit in Leerzeichen in einer Datei konvertieren möchten, sedkönnen Sie Folgendes verwenden:

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

oder sogar awk:

$ awk '$1=$1' ORS=' ' file_with_line_breaks > new_file_with_spaces
pferor
quelle
1
spongeist ein nützliches Dienstprogramm zum Überschreiben einer Eingabedatei. Es ist Teil des Pakets moreutils... zB. awk '$1=$1' ORS=' ' file |sponge file
Peter.O
@ferer Danke für die Information. Installiere moreutils...
pferor
5

Sie könnten trstattdessen versuchen, Folgendes zu verwenden:

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

Eine weitere Option wäre die Verwendung xargs(die außerdem mehrere Leerzeichen komprimiert):

string="this
    is 
a    test"

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

Echo ignoriert Leerzeichen, daher sollte es funktionieren:

new_string=`echo $string`
Kevin
quelle
Ja, es wird funktionieren, aber vielleicht zu gut. Multi-Whitespace wird auf ein einzelnes Leerzeichen reduziert. Dazu gehört das Konvertieren von Tabulatoren in Leerzeichen.
Peter.O
3

Wenn Sie bereits die Zeichenfolge als bash Variable haben, wie Ihr Beispiel zeigt, ist es sinnlos und eine Verschwendung von Ressourcen (und Typisierung) zu nennen sed, awk, printfetc ... Sie können einfach verwenden bash variable Expansion :

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

Sie müssen es nicht einmal neu zuweisen. Sie können die Erweiterung $stringunverändert verwenden und unverändert lassen.

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

Sie können diesen awk-Befehl auch versuchen,

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

Beispiel:

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

Dies konvertiert eine beliebige Folge von einem oder mehreren \nin der Shell-Variablen vorkommenden ewline-Zeichen $stringin ein einzelnes <space>.

mikeserv
quelle
0

Sie können den einfachen sed-Befehl verwenden

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