Wie kann ich einen Zeilenumbruch (" \n
") mit einem Leerzeichen (" ") unter Verwendung der sed
Befehl?
Ich habe es erfolglos versucht:
sed 's#\n# #g' file
sed 's#^$# #g' file
Wie kann ich es reparieren?
Wie kann ich einen Zeilenumbruch (" \n
") mit einem Leerzeichen (" ") unter Verwendung der sed
Befehl?
Ich habe es erfolglos versucht:
sed 's#\n# #g' file
sed 's#^$# #g' file
Wie kann ich es reparieren?
Ich bin kein Experte, aber ich denke, in sed
müssen Sie zunächst die nächste Zeile an den Musterbereich anhängen, indem Sie " N
". Aus dem Abschnitt "Multiline Pattern Space" in "Advanced sed Commands" des Buches sed & awk (Dale Dougherty und Arnold Robbins; O'Reilly 1997; Seite 107 in die Vorschau ):
Der mehrzeilige Befehl Next (N) erzeugt einen mehrzeiligen Musterbereich, indem er eine neue Eingabezeile liest und sie an den Inhalt des Musterbereichs anhängt. Der ursprüngliche Inhalt des Musterbereichs und die neue Eingabezeile werden durch einen Zeilenumbruch getrennt. Das eingebettete Newline-Zeichen kann in Mustern mit der Escape-Sequenz " \n ". In einem mehrzeiligen Musterraum stimmt das Metazeichen "^" mit dem allerersten Zeichen des Musterraums überein und nicht mit dem/den Zeichen, die auf einen eingebetteten Zeilenumbruch folgen. In ähnlicher Weise passt "$" nur auf den letzten Zeilenumbruch im Musterraum, nicht aber auf eingebettete Zeilenumbrüche. Nach der Ausführung des Befehls "Next" wird die Kontrolle an die nachfolgenden Befehle im Skript weitergegeben.
Desde man sed
:
[2addr]N
Hängt die nächste Eingabezeile an den Musterbereich an und verwendet ein eingebettetes Zeilenumbruchzeichen, um das angehängte Material vom ursprünglichen Inhalt zu trennen. Beachten Sie, dass sich die aktuelle Zeilennummer ändert.
Ich habe verwendet diese um (mehrere) schlecht formatierte Protokolldateien zu durchsuchen, in denen der Suchbegriff in einer "verwaisten" nächsten Zeile gefunden werden kann.
Ich habe einen hybriden Ansatz verwendet, um die Sache mit den Zeilenumbrüchen zu umgehen, indem ich tr verwende, um Zeilenumbrüche durch Tabulatoren zu ersetzen, und dann die Tabulatoren durch das, was ich will, ersetze. In diesem Fall, "
", da ich versuche, HTML-Umbrüche zu erzeugen.
echo -e "a\nb\nc\n" |tr '\n' '\t' | sed 's/\t/ <br> /g'`
Sie können auch diese Methode verwenden:
sed 'x;G;1!h;s/\n/ /g;$!d'
x - which is used to exchange the data from both space (pattern and hold).
G - which is used to append the data from hold space to pattern space.
h - which is used to copy the pattern space to hold space.
1!h - During first line won't copy pattern space to hold space due to \n is
available in pattern space.
$!d - Clear the pattern space every time before getting the next line until the
the last line.
Wenn die erste Zeile aus der Eingabe kommt, wird ein Austausch vorgenommen, also 1
geht in den Laderaum und \n
in den Musterbereich, wobei der Haltebereich an den Musterbereich angehängt wird, und es wird eine Substitution durchgeführt, die den Musterbereich löscht.
In der zweiten Zeile wird ein Austausch vorgenommen, 2
geht in den Laderaum und 1
kommt in den Musterraum, G
den Haltebereich an den Musterbereich anhängen, h
Kopieren Sie das Muster, wird die Ersetzung vorgenommen und gelöscht. Dieser Vorgang wird bis zum Erreichen von EOF fortgesetzt und gibt das genaue Ergebnis aus.
Als Antwort auf die obige "tr"-Lösung wird unter Windows (wahrscheinlich unter Verwendung der Gnuwin32-Version von tr) eine Lösung vorgeschlagen:
tr '\n' ' ' < input
funktionierte bei mir nicht, es trat entweder ein Fehler auf oder es wurde die \n mit '' aus irgendeinem Grund.
Die Verwendung einer anderen Funktion von tr, der Option "Löschen", hat jedoch funktioniert:
tr -d '\n' < input
oder \r\n ' anstelle von ' \n '
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.