GNU/Linux >> Linux Esercitazione >  >> Linux

Unire 3 righe consecutive con lo scambio?

Ehi, ho bisogno di unire tre righe consecutive con lo scambio tra la 2a e la 3a riga in 'file':

$cat file
Object Name: A
    comments: comment A
    manual_encdomain: Name: A 
Object Name: B
    comments: comment B
    manual_encdomain: Name: B 

Quindi, invece dell'output di seguito:

$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

Preferirei aver bisogno di questo

Object Name: A manual_encdomain: Name: A comments: comment A
Object Name: B manual_encdomain: Name: B comments: comment B

sed, awk qualsiasi cosa

Risposta accettata:

Sì, puoi usare sed per scambiare le linee:

$ 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

O, equivalentemente:

$ 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

Come funziona:

  • -E

    Questo attiva le espressioni regolari estese. (-E funziona sia su BSD (OSX) sed che su GNU sed moderno. Per le versioni precedenti di GNU sed, usa -r invece.)

    Senza la regex estesa, dobbiamo eseguire l'escape di ( e ) come mostrato sopra.

  • N;N

    Questo si legge nella seconda e nella terza riga.

  • s/n([^n]*)n([^n]*)/ 2 1/

    Questo scambia la seconda e la terza riga. La prima occorrenza di n([^n]*) acquisisce la seconda riga e la salva nel gruppo di acquisizione 1. La seconda occorrenza di n([^n]*) acquisisce la terza riga e la salva nel gruppo di acquisizione 2. Il testo sostitutivo, 2 1 scambia la posizione sostituendo le nuove righe con spazi.

Rimozione dello spazio bianco in eccesso

La seconda e la terza riga sono rientrate nel file di input. Se vogliamo rimuovere quello spazio bianco in più:

$ 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:]] è il modo sicuro per unicode per abbinare spazi vuoti e tabulazioni.


Linux
  1. Inserire nuove righe con valori mancanti (na)?

  2. Problemi con lo scambio in Ubuntu 18.04?

  3. Come rimuovere le cartelle con un certo nome

  4. `npm install` termina con Killed

  5. Come eliminare file con questo nome su Linux:-]???????q

Come distribuire un'applicazione multilivello con Kubernetes

Gestisci la sicurezza della rete con Firewalld utilizzando le righe di comando

Guida introduttiva ai Playbook Ansible

Installazione di OpenCart 2.0 con Softaculous

Problemi con l'unione degli account cPanel

Come sottrarre righe (linee) con AWK