GNU/Linux >> Linux Esercitazione >  >> Linux

Tutorial Unix Sed:7 esempi di operazioni Sed Hold e Pattern Buffer

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,

  1. Sed legge una riga e la inserisce nel pattern buffer.
  2. 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.
  3. 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,

  1. La prima riga verrà inserita nello spazio di attesa così com'è.
  2. 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).
  3. Ora la prima e la seconda riga sono state invertite e spostalo nello spazio di attesa.
  4. Ripeti i passaggi precedenti fino all'ultima riga.
  5. 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,

  1. Fino a quando non arriva la riga vuota, continua ad aggiungere le righe non vuote nello spazio di attesa
  2. 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,

  1. Per ogni ciclo, metti la linea nel buffer di attesa, se non corrisponde al pattern "Mysql".
  2. Se la riga corrisponde al pattern, prendi i dati dallo spazio di attesa (riga precedente) usando il comando g e stampali.
  3. 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,

  1. Se la linea non è vuota, scambiare la linea tra pattern e spazio di attesa. Quindi la prima riga verrà inserita nello spazio di attesa.
  2. 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.
  3. 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,

  1. Posiziona la prima riga nel buffer di attesa.
  2. Quando arriva la seconda riga, aggiungi a Spazio di attesa (prima riga)
  3. 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.
  4. Quindi scambia le linee nello spazio del modello.
  5. 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,

  1. 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.
  2. 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.

Linux
  1. Bash For Loop Guida ed esempi

  2. Tutorial sui comandi Linux ln per principianti (5 esempi)

  3. Linux nl Command Tutorial per principianti (7 esempi)

  4. Esempi di Bash For Loop e While Loop

  5. Il concetto di 'Spazio di attesa' e 'Spazio del modello' in sed

Esercitazione Unix Sed:stampa di righe di file utilizzando l'indirizzo e i modelli

Esercitazione Unix Sed:Elimina le righe di file utilizzando l'indirizzo e i modelli

Tutorial Unix Sed:esempi di sostituzione Sed avanzati

Tutorial Unix Sed:aggiungi, inserisci, sostituisci e conta righe di file

Tutorial Unix Sed:6 esempi per l'operazione di diramazione Sed

Tutorial Unix Sed:operazione su file multilinea con 6 esempi pratici