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).