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?

3voto

brandizzi Punkte 24822

Eine Lösung, die mir besonders gut gefällt, ist das Anhängen der gesamten Datei an den Hold Space und das Ersetzen aller Zeilenumbrüche am Ende der Datei:

$ (echo foo; echo bar) | sed -n 'H;${x;s/\n//g;p;}'
foobar

Allerdings hat mir jemand gesagt, dass der Laderaum in einigen Sediment-Implementierungen endlich sein kann.

3voto

Thor Punkte 42021

Sie können auch die Standard-Texteditor :

printf '%s\n' '%s/$/ /' '%j' 'w' | ed -s file

Hinweis: Dies speichert das Ergebnis zurück in file .

Wie bei den meisten sed Antworten hier, leidet diese Lösung darunter, dass zuerst die gesamte Datei in den Speicher geladen werden muss.

3voto

agc Punkte 7474

Eine weitere GNU sed Methode, fast dasselbe wie Zsolt Botykai Antwort aber diese verwendet sed die weniger häufig verwendete y ( transliterieren. ), der Folgendes speichert ein Byte des Codes (die nachgestellte g ):

sed ':a;N;$!ba;y/\n/ /'

Man würde hoffen y würde schneller laufen als s (vielleicht bei tr Geschwindigkeiten, 20x schneller), aber in GNU sed v4.2.2 y geht es um 4% langsamer als s .


Mehr tragbar BSD sed Version:

sed -e ':a' -e 'N;$!ba' -e 'y/\n/ /'

3voto

Robert Vila Punkte 221

Sie ist sed das die neuen Zeilen nach der "normalen" Ersetzung einführt. Zuerst wird das Zeichen für den Zeilenumbruch abgeschnitten, dann wird es gemäß Ihren Anweisungen verarbeitet, und dann wird ein Zeilenumbruch eingefügt.

Verwendung von sed Sie können "das Ende" einer Zeile (nicht den Zeilenumbruch) nach dem Beschneiden durch eine beliebige Zeichenkette für jede Eingabezeile ersetzen; aber, sed werden unterschiedliche Zeilen ausgegeben. Nehmen wir zum Beispiel an, Sie wollten das "Zeilenende" durch "===" ersetzen (allgemeiner als das Ersetzen durch ein einzelnes Leerzeichen):

PROMPT~$ cat <<EOF |sed 's/$/===/g'
first line
second line
3rd line
EOF

first line===
second line===
3rd line===
PROMPT~$

Um den Zeilenumbruch durch die Zeichenkette zu ersetzen, können Sie, wenn auch ineffizient, folgendes verwenden tr um die Zeilenumbruchzeichen durch ein "Sonderzeichen" zu ersetzen, und verwenden Sie dann sed um das Sonderzeichen durch die gewünschte Zeichenfolge zu ersetzen.

Zum Beispiel:

PROMPT~$ cat <<EOF | tr '\n' $'\x01'|sed -e 's/\x01/===/g'
first line
second line
3rd line
EOF

first line===second line===3rd line===PROMPT~$

3voto

kralyk Punkte 3983

Um leere Zeilen zu entfernen:

sed -n "s/^$//;t;p;"

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