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:
-
-E
Dadurch werden erweiterte reguläre Ausdrücke aktiviert. (
-E
funktioniert sowohl auf BSD (OSX) sed als auch auf modernem GNU sed. Verwenden Sie für ältere Versionen von GNU sed-r
stattdessen.)Ohne erweiterte Regex müssen wir
(
maskieren und)
wie oben gezeigt. -
N;N
Dies 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 1
tauscht 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.