English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Comando sed di Linux

大全命令Linux

Il comando sed di Linux utilizza script per elaborare file di testo.

Sed può elaborare e editare file di testo in base alle istruzioni del script.

Sed viene principalmente utilizzato per editare automaticamente uno o più file, semplificare le operazioni ripetute sui file e scrivere programmi di trasformazione.

Sintassi

sed [-hnV][-e<script>][-f<script file>][file di testo]

Spiegazione dei parametri:

  • -e<script> o --expression=<script> Elabora il file di testo di input con lo script specificato.

  • -f<script file> o --file=<script file> Elabora il file di testo di input con lo script specificato nell'opzione.

  • -h o --help Visualizza l'aiuto.

  • -n o --quiet o --silent Visualizza solo i risultati elaborati dallo script.

  • -V o --version Visualizza informazioni sulla versione.

Spiegazione delle azioni:

  • a : aggiungi, la stringa dopo a può essere utilizzata, e queste stringhe appariranno in una nuova riga (la riga successiva) ~

  • c : sostituisci, la stringa dopo c può essere utilizzata, e queste stringhe possono sostituire le righe tra n1 e n2!

  • d : elimina, poiché è eliminare, di solito non c'è nulla dopo d;

  • i : inserisci, la stringa dopo i può essere utilizzata, e queste stringhe appariranno in una nuova riga (la riga precedente);

  • p : stampa, ovvero stampare i dati selezionati. Di solito p viene eseguito insieme al parametro sed -n ~

  • s : sostituisci, può essere utilizzato per sostituire direttamente! Di solito l'azione s può essere combinata con espressioni regolari! Ad esempio, 1,20s/old/new/g è un esempio!

Esempio online

Aggiungi una riga dopo la quarta riga del file testfile, e visualizza il risultato come output standard, digitando il comando seguente nella riga di comando:

sed -e 4a\newLine testfile

Prima di tutto, visualizza il contenuto di testfile come segue:

$ cat testfile #Visualizza il contenuto di testfile  
HELLO LINUX!  
Linux è un sistema operativo libero di tipo unix.  
Questo è un file di test di linux!  
Linux test

Il risultato dell'output dopo l'uso del comando sed è il seguente:

$ sed -e 4a\newline testfile #Aggiungi una nuova stringa dopo la quarta riga utilizzando sed  
HELLO LINUX! #Contenuto originale del file testfile  
Linux è un sistema operativo libero di tipo unix.  
Questo è un file di test di linux!  
Linux test  
newline

Aggiunta/eliminazione a livello di riga

Elenca e stampa il contenuto di /etc/passwd, eliminando contemporaneamente le righe 2-5!

[root@www ~]# nl /etc/passwd | sed '2,5d'
1 root:x:0:0:root:/root:/bin/bash
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
.....(successivo abbreviato).....

L'azione di sed è '2,5d', dove 'd' significa eliminare! Poiché le righe 2-5 sono state eliminate, i dati visualizzati non contengono le righe 2-5. Inoltre, notare che il comando originale dovrebbe essere sed -e, ma senza -e va bene anche! Dovrebbe anche essere notato che l'azione dopo sed deve essere racchiusa tra doppi apici ''!

Eliminare solo la riga 2

nl /etc/passwd | sed '2d'

Per eliminare la riga 3 fino alla fine

nl /etc/passwd | sed '3,$d'

Aggiungere 'bere tè?' dopo la seconda riga (cioè aggiungere alla terza riga)!

[root@www ~]# nl /etc/passwd | sed '2a bere tè'
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
bere tè
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
.....(successivo abbreviato).....

E se si desidera aggiungere prima della seconda riga

nl /etc/passwd | sed '2i bere tè'

Se si desidera aggiungere più di due righe, aggiungere due righe di testo dopo la seconda riga, ad esempio Bere tè o ...... e bere birra?

[root@www ~]# nl /etc/passwd | sed '2a Bere tè o ......\'
> bere birra? ?
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
Bere tè o ......
bere birra?
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
.....(successivo abbreviato).....

Ogni riga deve essere aggiunta con la barra inversa '\'. Quindi, possiamo notare che alla fine della prima riga c'è una '\'.

Sostituzione e visualizzazione a livello di riga

Sostituire il contenuto delle righe 2-5 con 'No 2-5 numero'?

[root@www ~]# nl /etc/passwd | sed '2,5c No 2-5 numero'
1 root:x:0:0:root:/root:/bin/bash
No 2-5 numero
6 sync:x:5:0:sync:/sbin:/bin/sync
.....(successivo abbreviato).....

Con questo metodo possiamo sostituire intere righe di dati!

Elenco solo delle righe 5-7 del file /etc/passwd

[root@www ~]# nl /etc/passwd | sed -n '5,7p'
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

Puoi utilizzare la funzione di visualizzazione a livello di riga di sed per selezionare e visualizzare alcune righe di un file.

Ricerca e visualizzazione dei dati

Cerca le righe con la parola chiave root in /etc/passwd

nl /etc/passwd | sed '/root/p'
1  root:x:0:0:root:/root:/bin/bash
1  root:x:0:0:root:/root:/bin/bash
2  daemon:x:1:1:daemon:/usr/sbin:/bin/sh
3  bin:x:2:2:bin:/bin:/bin/sh
4  sys:x:3:3:sys:/dev:/bin/sh
5  sync:x:4:65534:sync:/bin:/bin/sync
....ignora

Se viene trovato root, oltre a stampare tutte le righe, verranno anche stampate le righe corrispondenti.

Quando si utilizza -n, verranno stampate solo le righe che contengono il modello.

nl /etc/passwd | sed -n '/root/p'
1  root:x:0:0:root:/root:/bin/bash

Ricerca e eliminazione dei dati

Elimina tutte le righe che contengono root in /etc/passwd, altre righe vengono visualizzate

nl /etc/passwd | sed '/root/d'
2  daemon:x:1:1:daemon:/usr/sbin:/bin/sh
3  bin:x:2:2:bin:/bin:/bin/sh
....ignora
#La corrispondenza della riga 1 root è stata eliminata

Ricerca e esecuzione dei comandi sui dati

Cerca /etc/passwd, trova la riga corrispondente a root, esegui il gruppo di comandi dopo il segno di apertura parentesi, separati da punto e virgola, qui sostituisci bash con blueshell e stampa questa riga:

nl /etc/passwd | sed -n '/root/{s/bash/blueshell/;p;q}'    
1  root:x:0:0:root:/root:/bin/blueshell

L'ultima q è uscire.

Ricerca e sostituzione dei dati

Oltre al trattamento delle righe intere, sed può anche utilizzare l'unità di riga per cercare e sostituire dati parziali. Fondamentalmente, la ricerca e la sostituzione di sed sono simili a quelle di vi! Sembra un po' così:

sed 's/要被取代的字串/新的字串/g'

Prima di tutto, osserviamo le informazioni originali, utilizzando /sbin/ifconfig per consultare l'IP

[root@www ~]# /sbin/ifconfig eth0
eth0 Link encap:Ethernet HWaddr 00:90:CC:A6:34:84
inet addr:192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::290:ccff:fea6:3484/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
.....(il testo successivo è omesso).....

L'indirizzo IP di questa macchina è 192.168.1.100.

Eliminare la parte precedente dell'indirizzo IP

[root@www ~]# /sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g'
192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0

Quindi eliminare la parte successiva, ossia: 192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0

Eliminare la parte successiva dell'indirizzo IP

[root@www ~]# /sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g' | sed 's/Bcast.*$//g'
192.168.1.100

Edizione multipla

Un comando sed che elimina i dati da terza riga a fine file di /etc/passwd e sostituisce bash con blueshell

nl /etc/passwd | sed -e '3,$d' -e 's/bash/blueshell/'
1  root:x:0:0:root:/root:/bin/blueshell
2  daemon:x:1:1:daemon:/usr/sbin:/bin/sh

-e indica l'edizione multipla, il primo comando di edizione elimina i dati da terza riga a fine file di /etc/passwd, il secondo comando sostituisce bash con blueshell.

Modifica diretta del contenuto del file (azione pericolosa)

sed può modificare direttamente il contenuto del file, senza dover utilizzare comandi di pipeline o reindirizzamento dei dati! Tuttavia, poiché questa azione modifica direttamente il file originale, per favore non testare mai con la configurazione del sistema! Utilizziamo ancora il file regular_express.txt per fare un test!

Il file regular_express.txt contiene il seguente contenuto:

[root@www ~]# cat regular_express.txt 
w3codebox.
google.
taobao.
facebook.
zhihu-
weibo-

Utilizzare sed per sostituire ogni riga finale di regular_express.txt che finisce con . con !

[root@www ~]# sed -i 's/\.$/\!/g' regular_express.txt
[root@www ~]# cat regular_express.txt 
w3codebox!
google!
taobao!
facebook!
zhihu-
weibo-

:q:q

Aggiungere direttamente all'ultima riga di regular_express.txt # Questo è un test:

[root@www ~]# sed -i '$a # This is a test' regular_express.txt
[root@www ~]# cat regular_express.txt 
w3codebox!
google!
taobao!
facebook!
zhihu-
weibo-
# This is a test

Poiché $ rappresenta l'ultima riga e l'azione di a è aggiungere, quindi viene aggiunto alla fine del file # Questo è un test

opzione -i di sed può modificare direttamente il contenuto del file, questa funzione è molto utile! Ad esempio, se hai un file di 1 milione di righe e devi aggiungere del testo alla riga 100, utilizzare vim potrebbe essere una follia! Poiché il file è troppo grande! Cos'altro posso fare? Utilizza sed! Attraverso la funzione di modifica/ricambio diretta di sed, non hai nemmeno bisogno di usare vim per revisionare!

大全命令Linux