Questo articolo fa parte della serie Unix Sed Tips and Tricks in corso.
Nei nostri precedenti articoli su sed abbiamo imparato:sed printing, sed delete, sed replacement , sed file write, sed multiple functions, sed multi-line operation e sed manipola file lines.
Nella nostra prima parte del tutorial di sed abbiamo appreso che sed ha due buffer:sed pattern buffer e sed hold buffer . Finora abbiamo parlato solo di pattern buffer.
In questo articolo esaminiamo come utilizzare sed hold e pattern buffer usando 7 esempi pratici di sed .
Come suggerisce il nome, sed hold buffer viene utilizzato per salvare tutto o parte dello spazio pattern sed per il successivo recupero. Il contenuto dello spazio del modello può essere copiato nello spazio di attesa, quindi nuovamente. Nessuna operazione viene eseguita direttamente nello spazio di attesa. sed fornisce una serie di funzioni hold e get per gestire questi movimenti.
Funzione Sed h
La funzione h (hold) copia il contenuto dello spazio del pattern in un'area di attesa (chiamata anche sed hold space ), distruggendo qualsiasi contenuto precedente dell'area di attesa.
Funzione Sed H
La funzione H aggiunge il contenuto dello spazio del modello al contenuto dell'area di attesa. Il contenuto precedente e quello nuovo sono separati da una nuova riga.
Funzione Sed g
La funzione g copia il contenuto dell'area di attesa nello spazio del modello, distruggendo il contenuto precedente dello spazio del modello.
Funzione Sed G
La funzione G aggiunge il contenuto dell'area di attesa al contenuto dello spazio del modello. Il contenuto precedente e quello nuovo sono separati da una nuova riga. Il numero massimo di indirizzi è due.
Funzione Sed x
La funzione di scambio scambia il contenuto dello spazio del modello e dell'area di attesa. Il numero massimo di indirizzi è due.
Vediamo ora alcuni esempi per conoscere i comandi precedenti.
Per prima cosa creiamo il file geekstuff.txt che verrà utilizzato negli esempi menzionati di seguito.
$ cat thegeekstuff.txt #Linux Administration Scripting Tips and Tricks #Windows Administration #Database Mysql Oracle Queries Procedures
1. Doppio spazio nel contenuto di un file usando il comando Sed
$sed 'G' thegeekstuff.txt #Linux Administration Scripting Tips and Tricks #Windows Administration #Database Mysql Oracle Queries Procedures $
In questo esempio,
- Sed legge una riga e la inserisce nel pattern buffer.
- Il comando G aggiunge il buffer di attesa al buffer del pattern separato da \n. quindi verrà aggiunta una nuova riga con il contenuto dello spazio del modello.
- Allo stesso modo, se vuoi triplicare lo spazio in un file, aggiungi due volte il contenuto del buffer di mantenimento al buffer del pattern. (G;G)
2. Stampa il contenuto del file in ordine inverso utilizzando il comando Sed
Stampa le righe di un file in ordine inverso (simile al comando tac di cui abbiamo discusso in precedenza).
$sed -n '1!G;h;$p' thegeekstuff.txt Procedures Queries Oracle Mysql #Database Administration #Windows Tips and Tricks Scripting Administration #Linux
In questo esempio,
- La prima riga verrà inserita nello spazio di attesa così com'è.
- Dalla seconda riga in poi, basta aggiungere il contenuto dello spazio di attesa con lo spazio del modello. (Ricorda che la seconda riga è nello spazio del modello e la prima riga è nello spazio di attesa).
- Ora la prima e la seconda riga sono state invertite e spostalo nello spazio di attesa.
- Ripeti i passaggi precedenti fino all'ultima riga.
- Una volta raggiunta l'ultima riga, aggiungi semplicemente il contenuto dello spazio di attesa con lo spazio del modello e stampa lo spazio del modello.
3. Stampa un paragrafo (solo se contiene un dato modello) usando il comando Sed
In thegeekstuff.txt stampa il paragrafo solo se contiene lo schema “Amministrazione”.
$ sed -e '/./{H;$!d;}' -e 'x;/Administration/!d' thegeekstuff.txt Linux Administration Scripting Tips and Tricks Windows Administration
In questo esempio,
- Fino a quando non arriva la riga vuota, continua ad aggiungere le righe non vuote nello spazio di attesa
- Quando arriva una riga vuota, ovvero il paragrafo finisce, scambia i dati tra il modello e lo spazio in attesa. In modo che l'intero paragrafo sia disponibile nello spazio del modello.
Controlla se il modello "Amministrazione" è disponibile, in caso affermativo non eliminarlo, ad esempio stampa lo spazio del modello
4. Stampa la linea immediatamente prima di un pattern match usando Sed Command
Stampa solo la riga immediatamente precedente, il pattern “Mysql”.
$ sed -n '/Mysql/{g;1!p;};h' thegeekstuff.txt #Database
In questo esempio,
- Per ogni ciclo, metti la linea nel buffer di attesa, se non corrisponde al pattern "Mysql".
- Se la riga corrisponde al pattern, prendi i dati dallo spazio di attesa (riga precedente) usando il comando g e stampali.
- Nel caso, se la prima riga corrisponde al pattern "Mysql", comunque lo spazio di attesa sarà vuoto.(Non c'è riga precedente alla prima riga).Quindi la prima riga non dovrebbe essere stampata(1!p)
5. Elimina l'ultima riga di ogni paragrafo usando Sed Command
$ sed -n -e '/^$/{x;d}' -e '/./x;p' thegeekstuff.txt #Linux Administration Scripting #Windows #Database Mysql Oracle Queries
In questo esempio,
- Se la linea non è vuota, scambiare la linea tra pattern e spazio di attesa. Quindi la prima riga verrà inserita nello spazio di attesa.
- Quando arriva la prossima riga non vuota, scambia lo spazio del modello e mantieni lo spazio e stampa lo spazio del modello. cioè la prima riga non vuota verrà stampata e la 2a riga verrà mantenuta. E nel ciclo successivo, la 2a riga non vuota viene stampata quando la 3a riga va in attesa e continua in questo modo.
- Quando arriva una riga vuota (la riga precedente alla riga vuota sarà disponibile nel buffer di attesa) basta scambiare il pattern e mantenere lo spazio, ed eliminare la riga (ultima riga del paragrafo) e iniziare il ciclo successivo.
6. Per ogni riga, aggiungi la riga precedente alla fine usando il comando Sed
$ sed 'H;x;s/^\(.*\)\n\(.*\)/\2\1/' thegeekstuff.txt #Linux Administration#Linux Scripting Administration Tips and Tricks Scripting Tips and Tricks #Windows Administration#Windows Administration #Database Mysql#Database Oracle Mysql Queries Oracle Procedures Queries
In questo esempio,
- Posiziona la prima riga nel buffer di attesa.
- Quando arriva la seconda riga, aggiungi a Spazio di attesa (prima riga)
- Quindi scambia il pattern e mantieni il buffer. Quindi ora lo spazio del modello avrà la prima e la seconda riga separate da \n, lo spazio in attesa avrà solo la seconda riga.
- Quindi scambia le linee nello spazio del modello.
- I passaggi precedenti vengono eseguiti fino alla fine del file
7. Aggiungi il tag di ogni blocco a ogni riga di quel blocco
$ sed ' /^#/{ h d } G s/^\(.*\)\n#\(.*\)/\2 \1/' thegeekstuff.txt Linux Administration Linux Scripting Linux Tips and Tricks Linux Windows Administration Windows Database Mysql Database Oracle Database Queries Database Procedures
In questo esempio,
- Quando viene soddisfatta la prima riga di un blocco (che inizia con #)
- mantieni quella linea nello spazio di attesa tramite il comando `h'
- Quindi elimina usando 'd' per iniziare un altro ciclo.
- Per le righe rimanenti di un blocco, il comando 'G' aggiunge la tag line dallo spazio trattenuto e il comando sostitutivo scambia tag e righe correttamente.