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 ?
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:
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.
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.
@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.
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,
foo\\nbar
oder passierenfoo\\\nbar
?Antworten:
Beachten Sie den Backslash, bevor Sie in der Ersetzungszeichenfolge auf return klicken.
quelle
sed
1979 mit dem ursprünglichen Befehl in Unix v7 ausgeführt. Der einzige Ort, an dem dies möglicherweise nicht funktioniert, sind nicht POSIXsed
-konforme Implementierungen, wie beispielsweise einige auf Busybox basierende. In csh funktioniert das nicht, aber es ist ein Problem mit csh.\\n
im Suchteil verwendet wird, warum nicht\n
im Ersetzen verwenden? Ersteres scheint zu implizieren, dass Letzteres existiert. dh Warum nicht$ echo '1\n2'|sed 's/\\n/\n/g'
\n
handelt es sich um ein Literal, das bedeutet, dass es als zwei Zeichen angezeigt wird: ein Schrägstrich gefolgt vonn
und nicht als ein einzelnes Zeilenumbruchzeichen. Daher zwei Backslashes, um Backslash zu einem Literal zu machen und dannn
Da Sie bereits Ihre portable
sed
Antwort haben, erwähne ich nur, dass diessed
selten das beste Werkzeug ist, wenn Sie Newlines irgendwie manipulieren müssen. Perl ist beinahe so portabel wiesed
, wird standardmäßig auf den meisten * nix-Systemen installiert und kann dies sehr einfach bewältigen:Eine andere sehr tragbare Wahl ist
awk
: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.
quelle
awk
hat ähnliche Portabilität Fragen (Ist meineawk
gute alteawk
,nawk
odergawk
?). Eigentlich fehlt die Version in meinen Solaris-Boxengsub()
. Meine Stimme hier ist für Perl (perl -nlawe '...'
ungefähr das automatische Verhalten vonawk
).awk
Portabilität an eineawk
POSIX-kompatible Version und verwenden Sie nur diese Funktionen. Unter Solaris finden Sie eine als/usr/xpg4/bin/awk
.echo "aa\nbb" | awk '{gsub(/\\n/,"\n");}1;'
?gsub()
sollte fast überall funktionieren. Sogar eine Busybox hat einenawk
.Wenn
H
oldspace leer ist, können Sie auch Folgendes tun:... 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:
Aber Vorsicht, das übersetzt alle Standard-C-
\
Backslash-Fluchten - wie\b
Ackspace und\r
Eturn und\00
Octals und was auch immer.quelle
Mit
gnu sed
dem funktioniert auch:quelle
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,
quelle