Questo articolo fa parte della serie Unix Sed Tips and Tricks in corso.
Come qualsiasi altro linguaggio di programmazione, sed fornisce anche speciali comandi di branching per controllare il flusso del programma.
In questo articolo, esaminiamo i seguenti due tipi di ramificazione Sed.
- Ramo incondizionato di Sed
- Ramo condizionale Sed
Sed. Sintassi del ramo incondizionato:
$ sed ':label command(s) b label'
- :etichetta – specificazione dell'etichetta.
- comandi – Qualsiasi comando sed
- etichetta:qualsiasi nome per l'etichetta
- etichetta b – salta all'etichetta senza controllare alcuna condizione. Se l'etichetta non è specificata, salta alla fine dello script.
Sintassi del ramo condizionale Sed:
$ sed ':label command(s) t label'
- :etichetta – specificazione dell'etichetta.
- comandi – Qualsiasi comando sed
- etichetta:qualsiasi nome per l'etichetta
- t etichetta – salta all'etichetta solo se l'ultimo comando sostitutivo ha modificato lo spazio del modello. Se l'etichetta non è specificata, salta alla fine dello script.
Crea un file di prova di esempio
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 Administration of Oracle Administration of Mysql Security Network Online\ Security Productivity Google Search\ Tips "Web Based Time Tracking, Web Based Todo list and Reduce Key Stores etc" $
Io. Esempi Sed per Ramo Incondizionato
Sed Esempio 1. Sostituisci la prima occorrenza di un pattern in un intero file
Nel file thegeekstuff.txt sostituisci la prima occorrenza di "Amministrazione" con "Supervisione".
$ sed '/Administration/{ s/Administration/Supervision/ :loop n b loop }' thegeekstuff.txt Linux Supervision Scripting Tips and Tricks Windows Administration Database Administration of Oracle Administration of Mysql Security Network Online\ Security Productivity Google Search\ Tips "Web Based Time Tracking, Web Based Todo list and Reduce Key Stores etc"
- Nel comando sed sopra, legge riga per riga e stampa lo spazio del pattern finché non si verifica l'amministrazione.
- Una volta che si verifica l'amministrazione, sostituire l'amministrazione con la supervisione (una sola occorrenza, notare che nessun flag 'g' in sostituzione).
- Una volta che la prima occorrenza è stata sostituita, basta leggere il contenuto del file rimanente e stampare.
- “n” è un comando sed che stampa lo spazio del pattern e lo sovrascrive con la riga successiva.
- Usato "loop" come etichetta. "n" stampa la riga corrente e sovrascrive lo spazio del modello con la riga successiva. b loop salta di nuovo al :loop. Quindi questo ciclo stampa il contenuto rimanente di thegeekstuff.txt.
Sed Esempio 2. Rimuovere i dati tra il pattern ” ” in un intero file
Nel nostro file di esempio ci sono tre righe tra “”.
sed -e ':loop $!{ N /\n$/!b loop } s/\"[^\"]*\"//g' thegeekstuff.txt Linux Administration Scripting Tips and Tricks Windows Administration Database Administration of Oracle Administration of Mysql Security Network Online\ Security Productivity Google Search\ Tips $
- Il comando sopra keep aggiunge tutte le righe di un file finché non si verifica la fine del file.
- $! – Se non è una fine del file.
- N – Aggiungi la riga successiva con lo spazio del modello delimitato da \n
- /\n$/!b loop – Se questa non è l'ultima riga del file, salta di nuovo al loop.
- Ora tutte le linee saranno disponibili nello spazio pattern delimitato da newline. Sostituisci tutte le occorrenze di dati tra ” con il vuoto.
Sed Esempio 3. Rimuovere i tag HTML di un file
Diciamo che ho un file con il seguente contenuto html
$ cat index.html <html><body> <table border=2><tr><td valign=top align=right>1.</td> <td>Line 1 Column 2</ td> </table> </body></html>
Il seguente comando sed rimuove tutti i tag html dal file specificato
$ sed '/</{ :loop s/<[^<]*>//g /</{ N b loop } }' index.html 1. Line 1 Column 2
- Ogni volta che trova una riga contenente "<", rimuovi prima tutti i tag HTML di quella riga.
- Se ora lo spazio del modello contiene '<', ciò implica un tag multilinea. Ora ripeti il seguente ciclo:
- Unisciti alla riga successiva
- Rimuovi tutti i tag HTML finché non esiste un singolo "<"
- Quando non esiste alcun '<' nello spazio del modello, lo stampiamo e iniziamo un nuovo ciclo.
II. Esempi di Sed per ramo condizionale
Sed Esempio 4. Se una riga termina con una barra rovesciata, aggiungi la riga successiva.
Il nostro file di esempio ha due righe che terminano con una barra rovesciata, ora dobbiamo aggiungere la riga successiva.
$ sed ' :loop /\\$/N s/\\\n */ / t loop' thegeekstuff.txt Linux Administration Scripting Tips and Tricks Windows Administration Database Administration of Oracle Administration of Mysql Security Network Online Security Productivity Google Search Tips "Web Based Time Tracking, Web Based Todo list and Reduce Key Stores etc"
- Controlla se la riga termina con la barra rovesciata (/\\$/), se sì, leggi e aggiungi la riga successiva allo spazio del modello e sostituisci \ alla fine della riga e il numero di spazi seguito da quello, con il singolo spazio.
- Se la sostituzione ha esito positivo, ripetere il passaggio precedente. Il ramo verrà eseguito solo se la sostituzione ha esito positivo.
- Ramo condizionale usato principalmente per pattern ricorsivi.
Sed Esempio 5. Comunica una stringa numerica.
sed ' :loop s/\(.*[0-9]\)\([0-9]\{3\}\)/\1,\2/ t loop' 12342342342343434 12,342,342,342,343,434
- Raggruppa le cifre in due gruppi.
- Il primo gruppo è costituito da tutte le cifre fino alle ultime tre cifre. Le ultime tre cifre vengono acquisite nel 2° gruppo.
- Quindi i due gruppi corrispondenti vengono separati da una virgola. Quindi le stesse regole vengono applicate alla linea ancora e ancora fino a quando tutti i numeri non sono stati raggruppati in gruppi di tre.
- Ad esempio, nella prima iterazione sarà 12342342342343,434
- Nell'iterazione successiva 12342342342,343,434 e continua finché non ci sono meno di tre cifre.
Sed Esempio 6. Formattazione:Sostituisci ogni spazio iniziale di una riga con '+'
$ sed ' s/^ */&\n/ :loop s/^\n//;s/ \n/\n+/ t loop' test Linux ++++++++Administration ++++++++Scripting ++++++++++++++++Tips and Tricks Windows ++++++++Administration Database ++++++++Administration of Oracle ++++++++Administration of Mysql Security ++++++++Network +++++++++++++++++Online\ ++++++++Security Productivity ++++++++Google Search\ ++++++++Tips ++++++++"Web Based Time Tracking, ++++++++Web Based Todo list and ++++++++Reduce Key Stores etc"
- Separa tutti gli spazi iniziali e gli altri caratteri di una riga con un carattere di nuova riga.
- Ora sostituisci spazio e newline con newline e +. Quindi da destra a sinistra lo spazio sarà sostituito da + e la nuova riga verrà spostata a sinistra per un carattere.
- Finalmente all'inizio della riga ci sarà \n, quindi rimuovi quella nuova riga.