Ersetzen Sie \ n durch einen Zeilenumbruch

23

Ich bin so verwirrt von GNU sed, POSIX sedund BSDs sedunzähligen Optionen. Wie ersetze ich \nmit diesen drei sedTypen das Literal durch das Newline-Zeichen ?

Avinash Raj
quelle
Sie haben viele verschiedene Dinge, welchen Teil möchten Sie wissen?
4.
@ Gnouc ich denke jetzt ist es klar.
Avinash Raj
1
Hast du dir diese Frage angesehen ?
Groxxda
2
Was möchten Sie bei der Eingabe wie foo\\nbaroder passieren foo\\\nbar?
Gilles 'SO- hör auf böse zu sein'
einfach, foo \\ in der nächsten zeile wäre es bar.
Avinash Raj

Antworten:

30
sed 's/\\n/\
/g'

Beachten Sie den Backslash, bevor Sie in der Ersetzungszeichenfolge auf return klicken.

entmutigen
quelle
Funktioniert das für alle Arten von Seds?
Avinash Raj
Ich glaube es sollte; Ich habe nur unter Linux mit der Gnu-Version getestet.
Unxnut
11
@AvinashRaj. Das ist POSIX und wurde sed1979 mit dem ursprünglichen Befehl in Unix v7 ausgeführt. Der einzige Ort, an dem dies möglicherweise nicht funktioniert, sind nicht POSIX sed-konforme Implementierungen, wie beispielsweise einige auf Busybox basierende. In csh funktioniert das nicht, aber es ist ein Problem mit csh.
Stéphane Chazelas
Da \\nim Suchteil verwendet wird, warum nicht \nim Ersetzen verwenden? Ersteres scheint zu implizieren, dass Letzteres existiert. dh Warum nicht$ echo '1\n2'|sed 's/\\n/\n/g'
In diesem Fall \nhandelt es sich um ein Literal, das bedeutet, dass es als zwei Zeichen angezeigt wird: ein Schrägstrich gefolgt von nund nicht als ein einzelnes Zeilenumbruchzeichen. Daher zwei Backslashes, um Backslash zu einem Literal zu machen und dannn
Uhr
9

Da Sie bereits Ihre portable sedAntwort haben, erwähne ich nur, dass dies sedselten das beste Werkzeug ist, wenn Sie Newlines irgendwie manipulieren müssen. Perl ist beinahe so portabel wie sed, wird standardmäßig auf den meisten * nix-Systemen installiert und kann dies sehr einfach bewältigen:

printf '%s\n' 'aa\nbb' | perl -pe 's/\\n/\n/g'

Eine andere sehr tragbare Wahl ist awk:

printf '%s\n' 'aa\nbb' | awk  '{gsub("\\\\n","\n")};1'

Denken Sie unter Solaris daran, das Standard-awk in / usr / xpg4 / bin zu verwenden. Das in / bin ist ein historisches und sollte nicht für neue Skripte verwendet werden.

terdon
quelle
Ich würde sagen , awkhat ähnliche Portabilität Fragen (Ist meine awkgute alte awk, nawkoder gawk?). Eigentlich fehlt die Version in meinen Solaris-Boxen gsub(). Meine Stimme hier ist für Perl ( perl -nlawe '...'ungefähr das automatische Verhalten von awk).
ArielCo
2
@arielCo: Halten Sie sich aus Gründen der awkPortabilität an eine awkPOSIX-kompatible Version und verwenden Sie nur diese Funktionen. Unter Solaris finden Sie eine als /usr/xpg4/bin/awk.
Scrutinizer
@terdon wie wäre es damit echo "aa\nbb" | awk '{gsub(/\\n/,"\n");}1;'?
Avinash Raj
@arielCo tatsächlich ist awk portabler als perl. Mein zweiter awk-Ansatz, der nicht verwendet wird, gsub()sollte fast überall funktionieren. Sogar eine Busybox hat einen awk.
Terdon
1
gsub () ist POSIX (gsub wurde in SVR3.1 hinzugefügt, POSIX awk basiert auf SVR4 mit einigen Ergänzungen, weitere Informationen finden Sie im Handbuch von gawk), gensub () ist die GNU-Erweiterung. Das ursprüngliche awk, das unter Solaris immer noch als / bin / awk gefunden wurde, unterstützte gsub () nicht, unterstützte jedoch auch kein FS mit mehreren Zeichen.
Stéphane Chazelas
1

Wenn Holdspace leer ist, können Sie auch Folgendes tun:

sed '/\\n/G;s/\\n\(.*\)\(.\)/\2\1/;P;D'

... aber die Antwort von uxnut ist bereits schneller und einfacher, sodass Sie sie so nehmen können, wie Sie wollen.

Eine andere fremde Möglichkeit:

INPUT | sed -n l | while read v ; do printf "${v%?}" ; done

Aber Vorsicht, das übersetzt alle Standard-C- \Backslash-Fluchten - wie \bAckspace und \rEturn und \00Octals und was auch immer.

mikeserv
quelle
0

Mit gnu seddem funktioniert auch:

gsed -n -e 'H;${x;s/\\n/\n/g;p;}'
Dirk Hoffmann
quelle
-2

Sie benötigen eine Lösung in sed, und die ist bereits unten angegeben. Aber ich wollte eine weitere Möglichkeit hinzufügen, dass IMHO nur einfacher und schneller ist,

tr -d "\n"
jpmuc
quelle
1
was macht das Alle Zeilenumbrüche aus der Eingabe löschen?
mikeserv
Ja, genau das macht es
jpmuc
5
aber wieso? was hat das mit der frage überhaupt zu tun?
MikeServ
1
Dadurch wird nur "\ n" entfernt, wenn Sie gefragt werden, wie die Zeichenfolge "\ n" durch tatsächliche Zeilenumbrüche ersetzt werden soll.
Spuder