Hey, ich muss drei aufeinanderfolgende Zeilen mit dem Wechsel zwischen der 2. und 3. Zeile in "Datei" zusammenführen:
$cat file
Object Name: A
comments: comment A
manual_encdomain: Name: A
Object Name: B
comments: comment B
manual_encdomain: Name: B
Anstatt also unten auszugeben:
$sed 'N;N;s/n/ /g' file
Object Name: A comments: comment A manual_encdomain: Name: A
Object Name: B comments: comment B manual_encdomain: Name: B
Ich würde eher das brauchen
Object Name: A manual_encdomain: Name: A comments: comment A
Object Name: B manual_encdomain: Name: B comments: comment B
sed, awk irgendwas
Akzeptierte Antwort:
Ja, Sie können sed verwenden, um Zeilen auszutauschen:
$ sed -E 'N;N;s/n([^n]*)n([^n]*)/ 2 1/' file
Object Name: A manual_encdomain: Name: A comments: comment A
Object Name: B manual_encdomain: Name: B comments: comment B
Oder äquivalent:
$ sed 'N;N;s/n([^n]*)n([^n]*)/ 2 1/g' file
Object Name: A manual_encdomain: Name: A comments: comment A
Object Name: B manual_encdomain: Name: B comments: comment B
Wie es funktioniert:
-
-EDadurch werden erweiterte reguläre Ausdrücke aktiviert. (
-Efunktioniert sowohl auf BSD (OSX) sed als auch auf modernem GNU sed. Verwenden Sie für ältere Versionen von GNU sed-rstattdessen.)Ohne erweiterte Regex müssen wir
(maskieren und)wie oben gezeigt. -
N;NDies lautet in der zweiten und dritten Zeile.
-
s/n([^n]*)n([^n]*)/ 2 1/Dadurch werden die zweite und die dritte Zeile vertauscht. Das erste Vorkommen von
n([^n]*)erfasst die zweite Zeile und speichert sie in Erfassungsgruppe 1. Das zweite Vorkommen vonn([^n]*)erfasst die dritte Zeile und speichert sie in Erfassungsgruppe 2. Der Ersatztext,2 1tauscht die Position und ersetzt dabei die Zeilenumbrüche durch Leerzeichen.
Überflüssigen Leerraum entfernen
Die zweite und dritte Zeile werden in der Eingabedatei eingerückt. Wenn wir diesen zusätzlichen Leerraum entfernen möchten:
$ sed -E 'N;N;s/n[[:blank:]]*([^n]*)n[[:blank:]]*([^n]*)/ 2 1/g' file
Object Name: A manual_encdomain: Name: A comments: comment A
Object Name: B manual_encdomain: Name: B comments: comment B
[[:blank:]] ist die Unicode-sichere Methode, um Leerzeichen und Tabulatoren abzugleichen.