Come parte della nostra serie di tutorial UNIX sed in corso in precedenza, abbiamo trattato la stampa, l'eliminazione, la sostituzione, la scrittura di file, comandi di manipolazione dei file ecc., con la singola riga nello spazio del modello.
In questo articolo esaminiamo come eseguire l'operazione multilinea in Sed.
Vi ricordate la metodologia di lavoro Sed che abbiamo appreso nel nostro primo tutorial sed?. In quell'articolo abbiamo spiegato che Sed legge riga per riga, rimuove tutte le nuove righe finali, inserisce una riga in un buffer dello spazio del modello, elabora secondo i comandi forniti e stampa lo spazio del modello.
Nel caso, se desideri eliminare tutte le nuove righe in un file, non puoi utilizzare il metodo seguente. Perché la nuova riga è già stata rimossa e posizionata nello spazio del modello.
$ sed 's/\n//' filename or $sed 's/\n/ENDOFLINE\n/' filename
Per situazioni come questa sed multilinea è appropriato. Sed fornisce il comando "N" per le operazioni multilinea.
Il comando N legge una riga successiva dall'input, Aggiungi la riga successiva allo spazio del modello. La riga successiva è separata dallo spazio del modello originale da un carattere di nuova riga.
Per prima cosa creiamo il file geekstuff.txt che verrà utilizzato in tutti gli esempi menzionati di seguito.
$ cat thegeekstuff.txt Linux Sysadmin Databases - Oracle, mySQL etc. Databases - Oracle, mySQL etc. Security (Firewall, Network, Online Security etc) Storage in Linux Website Design Website Design Windows- Sysadmin, reboot etc. $
Nota: Ci sono due righe vuote consecutive nell'input sopra. (5a e 6a riga).
Sed Esempio 1. Unisci due linee consecutive
$ sed -e '{ N s/\n/ @ / }' thegeekstuff.txt Linux Sysadmin @ Databases - Oracle, mySQL etc. Databases - Oracle, mySQL etc. @ Security (Firewall, Network, Online Security etc) @ Storage in Linux @ Website Design Website Design @ Windows- Sysadmin, reboot etc.
Nell'esempio sopra,
- Le parentesi graffe “{” e “}” utilizzate per raggruppare i comandi. Le parentesi graffe ei comandi sed devono trovarsi su righe separate.
- Sed legge la prima riga e la inserisce nello spazio del modello, il comando N legge la riga successiva e aggiunge lo spazio del modello, ovvero la prima riga separata da nuova riga. Quindi ora lo spazio del modello avrà la prima riga\nseconda riga.
- Prossima sostituzione di \n con spazio@spazio e stampa il contenuto dello spazio del modello come comportamento predefinito di sed. Quindi le righe consecutive sono unite e delimitate da " @ "
Sed Esempio 2. Numera ogni riga non vuota di un file
Come accennato nel nostro articolo precedente, =è un comando per ottenere il numero di riga di un file.
$ sed '/./=' thegeekstuff.txt | sed 'N; s/\n/ /' 1 Linux Sysadmin 2 Databases - Oracle, mySQL etc. 3 Databases - Oracle, mySQL etc. 4 Security (Firewall, Network, Online Security etc) 7 Storage in Linux 8 Website Design 9 Website Design 10 Windows- Sysadmin, reboot etc.
- Il primo comando sed stampa il numero di riga e stampa la riga originale in una riga successiva se non è uno spazio vuoto.( Eseguilo e vedi l'output del primo comando sed).
- Il prossimo comando sed aggiunge solo un paio di righe.
Sed Esempio 3. Elimina due righe vuote consecutive dall'input
$ sed '/^$/{ N /^\n$/d }' thegeekstuff.txt Linux Sysadmin Databases - Oracle, mySQL etc. Databases - Oracle, mySQL etc. Security (Firewall, Network, Online Security etc) Storage in Linux Website Design Website Design Windows- Sysadmin, reboot etc.
Se la riga è vuota, leggi e aggiunge la riga successiva, /^\n$/ rappresenta, due righe sono vuote,\n viene aggiunto dal comando N. Quindi elimina semplicemente lo spazio del modello e inizia il ciclo successivo usando il comando 'd'.
Sed Esempio 4. Elimina le ultime 2 righe di un file
Prima di visualizzare questo esempio devi conoscere due interessanti comandi sed.
- P – che stampa la prima riga di uno spazio pattern. (fino al primo \n).
- D – Elimina la prima riga dallo spazio del modello. Il controllo passa quindi all'inizio dello script.
$ sed 'N;$!P;$!D;$d' thegeekstuff.txt Linux Sysadmin Databases - Oracle, mySQL etc. Databases - Oracle, mySQL etc. Security (Firewall, Network, Online Security etc) Storage in Linux Website Design
- Legge la prima riga e la posiziona nello spazio del modello.
- Il comando N legge la riga successiva e la aggiunge allo spazio del modello separato da una nuova riga. (Ora prima riga\nseconda riga)
- Se non raggiunge l'ultima riga ($), stampa la prima riga ed elimina la prima riga solo dallo spazio del modello. Quindi il ciclo ricomincia.
- In questo modo si unisce alla 2a\n3a riga, alla 3a\n4a riga e continua.
- Alla fine quando ha la 9a\n10a riga in uno spazio di pattern, raggiunge $ quindi cancella semplicemente lo spazio di pattern. ($!P e $!D non verranno stampati ed eliminati se è $).
Sed Esempio 5. Stampa le ultime 2 righe di un file
$ sed '$!N;$!D' thegeekstuff.txt Website Design Windows- Sysadmin, reboot etc.
Quanto sopra unisce ed elimina ogni riga finché le ultime due righe non sono presenti nello spazio del modello. Quando raggiunge $, stampa lo spazio del modello che avrà solo le ultime due righe.
Sed Esempio 6. Elimina righe duplicate e consecutive da un file
Il comando seguente controlla ogni riga unita alla riga successiva, controlla se entrambe sono uguali quindi non lo spazio del modello di stampa (!P), elimina semplicemente la prima riga dallo spazio del modello. Quindi solo una riga rimarrà nello spazio del modello.
$ sed '$!N; /^\(.*\)\n\1$/!P; D' thegeekstuff.txt Linux Sysadmin Databases - Oracle, mySQL etc. Security (Firewall, Network, Online Security etc) Storage in Linux Website Design Windows- Sysadmin, reboot etc.