Ich bin so verwirrt von GNU sed
, POSIX sed
und BSDs sed
unzähligen Optionen. Wie ersetze ich \n
mit diesen drei sed
Typen das Literal durch das Newline-Zeichen ?
foo\\nbar
oder passieren foo\\\nbar
?
Ich bin so verwirrt von GNU sed
, POSIX sed
und BSDs sed
unzähligen Optionen. Wie ersetze ich \n
mit diesen drei sed
Typen das Literal durch das Newline-Zeichen ?
foo\\nbar
oder passieren foo\\\nbar
?
Antworten:
sed 's/\\n/\
/g'
Beachten Sie den Backslash, bevor Sie in der Ersetzungszeichenfolge auf return klicken.
sed
1979 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.
\\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 von n
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 dies sed
selten 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.
awk
hat ähnliche Portabilität Fragen (Ist meine awk
gute alte awk
, nawk
oder 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
).
awk
Portabilität an eine awk
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;'
?
Wenn H
oldspace 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 \b
Ackspace und \r
Eturn und \00
Octals und was auch immer.
Mit gnu sed
dem funktioniert auch:
gsed -n -e 'H;${x;s/\\n/\n/g;p;}'
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"