1729 Stimmen

Wie kann ich jeden Zeilenumbruch ( \n ) mit einem Leerzeichen mit sed?

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?

13voto

StevenWernerCS Punkte 712

Wenn Sie das Pech haben, mit Windows-Zeilenenden arbeiten zu müssen, müssen Sie die \r und die \n :

tr '\r\n' ' ' < $input > $output

9voto

Arjan Punkte 21308

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.

7voto

rfengr Punkte 79

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'`

7voto

Kalanidhi Punkte 4422

Sie können auch diese Methode verwenden:

sed 'x;G;1!h;s/\n/ /g;$!d'

Erläuterung

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.

Durchfluss

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.

7voto

John Lawler Punkte 71

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.com

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.

Powered by:

X