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