Amministratore Linux: comando sed

sedè un'utilità complessa da padroneggiare. Questo comando esegue lo streaming dell'editor per filtrare e trasformare il testo. Sono stati scritti interi libri dedicati all'uso efficiente di sed. Quindi, tieni presente che questo tutorial ha lo scopo di introdurre tre usi comuni di base di sed :

  • sostituzione del carattere
  • operazioni di stampa
  • eliminare le operazioni

La sintassi del comando comune per sed è:

sed [options] [file to operate on]

Di seguito sono riportati gli interruttori sed comuni da ricordare.

Interruttore Azione
-io Modifica i file al posto del flusso, -i [SUFFIX] per creare il file di backup
-e Aggiungi i comandi di script da eseguire
-n Silenzioso, elimina la stampa automatica
-r ReGex, usa espressioni regolari estese nello script

-iapplicherà le modifiche a un file, invece di modificare il flusso del file passato a sed .

sed , se utilizzato con-eopzione estende il comando per elaborare più operazioni su un flusso. Questo può essere fatto invece di piping ricorsivamente sed.

echo "Windows and IIS run the Internet" | sed -e 's/Windows/Linux/' -e 's/ and           
IIS//'  -e 's/run/runs/' 
Linux runs the Internet

Il -nl'opzione con sed sopprime la stampa predefinita su stdout. Usando il comando print di sed, come vediamo, ogni riga verrà duplicata in stdout.

bash-3.2# sed 'p' ./lines.txt  
line1 
line1 
line2 
line2

Questa volta, usiamo l' opzione -n con sed -

bash-3.2# sed -n 'p' ./lines.txt  
line1 
line2

sed invierà flussi di contenuto a stdout. Quando viene aggiunto il comando " p " o print, viene inviato un flusso separato per ciascuna riga che causa la duplicazione di tutte le righe in stdout.

comando di sostituzione di sed

Questo comando è specificato con il 's' opzione. Abbiamo già visto sed usato con il suo comando di sostituzione già alcune volte. Di seguito è riportato un semplice esempio:

[[email protected] Documents]# echo "developers eat veggies and fruit" | sed -e
's/veggies/pizza/' -e 's/fruit/coffee/' 
developers eat pizza and coffee 
[[email protected] Documents]#

Proviamo questo, su un file chiamato dev.txt -

[[email protected] centos]# cat dev.txt  
Developers code all night and sleep all day.
[[email protected] centos]#

Ora, cambiamo il contenuto di un file invece del suo flusso di output inviato a sed -

[[email protected] centos]# sed -ibak 's/sleep/code/' ./dev.txt  
[[email protected] centos]# ls dev* 
dev.txt  dev.txtbak 
[[email protected] centos]# cat dev* 
Developers code all night and code all day. 
Developers code all night and sleep all day. 
[[email protected] centos]#

Note - Abbiamo usato -i opzione con un suffisso univoco per creare un file di backup.

comando sed print

Questo comando viene specificato con il comando " p ".

Usiamo il nostro file names.txt, l'output è stato modificato per brevità -

[[email protected] Documents]# sed -n "p" ./names.txt  
Ted:Daniel:101 
Jenny:Colon:608 
Dana:Maxwell:602 
Marian:Little:903 
Bobbie:Chapman:403 
Nicolas:Singleton:203 
Dale:Barton:901 
Aaron:Dennis:305

sed consente l'uso di "indirizzi", per definire in modo più granulare ciò che viene stampato su stdout -

[[email protected] Documents]# sed -n "1,10p" ./names.txt
Ted:Daniel:101 
Jenny:Colon:608 
Dana:Maxwell:602 
Marian:Little:903 
Bobbie:Chapman:403 
Nicolas:Singleton:203 
Dale:Barton:901 
Aaron:Dennis:305 
Santos:Andrews:504 
Jacqueline:Neal:102 
[[email protected] Documents]#

Proprio come head , abbiamo stampato le prime 10 righe del nostro file names.txt.

E se volessimo stampare solo quelli con un ufficio al 9 ° piano?

[[email protected] Documents]# sed -n "/90/p" ./names.txt 
Marian:Little:903 
Dale:Barton:901 
Kellie:Curtis:903: 
Gina:Carr:902 
Antonia:Lucas:901 
[[email protected] Documents]#

Molto facile. Possiamo anche stampare tutti, tranne quelli con uffici al 9 ° piano -

[[email protected] Documents]# sed -n '/90/ !p' ./names.txt 
Ted:Daniel:101 
Jenny:Colon:608 
Dana:Maxwell:602 
Bobbie:Chapman:403 
Nicolas:Singleton:203 
Aaron:Dennis:305 
Santos:Andrews:504 
Jacqueline:Neal:102 
Billy:Crawford:301 
Rosa:Summers:405 
Matt:Davis:305 
Francisco:Gilbert:101
Sidney:Mac:100 
Heidi:Simmons:204 
Matt:Davis:205 
Cristina:Torres:206 
Sonya:Weaver:403 
Donald:Evans:403

Nel codice precedente, abbiamo negato 'p'operazione di stampa tra / e / con !. Funziona in modo simile al comando "d" o cancella . Tuttavia, i risultati possono variare con la negazione in sed . Quindi, come regola generale: p per stampare e negare ciò che non vuoi.

sed delete comando

Come accennato, il comando delete è l'opposto del comando sed print. Cominciamo con il nostro file name.txt -

[[email protected] Documents]# sed 'd' ./names.txt  
[[email protected] Documents]#

Niente stampato. Con il comando precedente, abbiamo chiesto a sed di eliminare ogni riga da stdout nel flusso. Ora, stampiamo solo le prime due righe e "cancelliamo" il resto dello stream -

[[email protected] Documents]# sed '1,2 !d' ./names.txt  
Ted:Daniel:101 
Jenny:Colon:608
[[email protected] Documents]#

Vedere? Simile al comando " p " o print. Ora facciamo qualcosa di utile con il comando di cancellazione. Supponiamo di voler rimuovere tutte le righe vuote in un file -

[[email protected] Documents]# cat lines.txt  
line1 
line2 
line3 
line4 
line5 
[[email protected] Documents]#

Non è raro ricevere un file come questo contenente testo confuso, copiando e incollando un'e-mail o formattato con interruzioni di riga non standard. Invece di modificare interattivamente il file in vim, possiamo usare sed per fare il lavoro per noi.

[[email protected] Documents]# sed -i '/^\s*$/ d' ./lines.txt
[[email protected] Documents]# cat ./lines.txt  
line1 
line2 
line3 
line4 
line5 
[[email protected] Documents]#

Il file è ora formattato in modo facilmente leggibile.

Note - Quando si apportano modifiche ai file importanti, utilizzare -iinterruttore. Si consiglia vivamente di aggiungere un suffisso per il backup del file per riservare il contenuto del file ( sed può apportare alcune modifiche estreme con il minimo errore di battitura).