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.


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

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

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

3

Echo ignoriert Leerzeichen, daher sollte es funktionieren:

new_string=`echo $string`

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

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.

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


0

Sie können den einfachen sed-Befehl verwenden

 $-sed ':loop;N;s/\n/ /g;t loop'
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.