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 ?
foo\\nbaroder passieren foo\\\nbar?
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 ?
foo\\nbaroder passieren foo\\\nbar?
Antworten:
sed 's/\\n/\
/g'
Beachten Sie den Backslash, bevor Sie in der Ersetzungszeichenfolge auf return klicken.
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.
\\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'
\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
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.
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).
awkPortabilität an eine awkPOSIX-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 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.
Mit gnu seddem 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"