GNU/Linux >> LINUX-Kenntnisse >  >> Linux

3 aufeinanderfolgende Zeilen mit Swap zusammenführen?

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 von n([^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.


Linux
  1. Ordner mit Mv zusammenführen?

  2. Zeilenbereich durch Zeilenbereich ersetzen (sed oder andere)?

  3. Zeilenumbruch mit Mc verwenden?

  4. Alle Dateien finden, deren Name eine Zeichenfolge enthält

  5. `npm install` endet mit Killed

So stellen Sie eine Multi-Tier-Anwendung mit Kubernetes bereit

Verwalten Sie die Netzwerksicherheit mit Firewalld über Befehlszeilen

Erste Schritte mit Ansible Playbooks

Installation von OpenCart 2.0 mit Softaculous

Installieren Sie phpList mit Softaculous

Probleme beim Zusammenführen von cPanel-Konten