GNU/Linux >> Linux Esercitazione >  >> Linux

Tutorial Unix Sed:esempi di sostituzione Sed avanzati

Questo articolo fa parte della serie Unix Sed Tips and Tricks in corso.

Nei nostri precedenti articoli su sed abbiamo imparato:stampa sed, cancellazione sed, sostituto sed, scrittura file sed e comandi multipli sed.

In questo articolo, esaminiamo alcune soluzioni alternative interessanti con il comando sostitutivo "s" in sed con diversi esempi pratici.

Io. Delimitatore di sostituzione Sed

Come abbiamo discusso nel nostro post precedente, possiamo usare i diversi delimitatori come @ % |; :nel comando sostitutivo sed.

Creiamo prima il file path.txt che verrà utilizzato in tutti gli esempi menzionati di seguito.

$ cat path.txt
/usr/kbos/bin:/usr/local/bin:/usr/jbin:/usr/bin:/usr/sas/bin
/usr/local/sbin:/sbin:/bin/:/usr/sbin:/usr/bin:/opt/omni/bin:
/opt/omni/lbin:/opt/omni/sbin:/root/bin

Esempio 1 – sed @ delimitatore:sostituisci /opt/omni/lbin con /opt/tools/bin

Quando sostituisci un nome di percorso che ha '/', puoi usare @ come delimitatore invece di '/'. Nell'esempio sed seguente, nell'ultima riga del file di input, /opt/omni/lbin è stato modificato in /opt/tools/bin.

$ sed 's@/opt/omni/lbin@/opt/tools/bin@g' path.txt
/usr/kbos/bin:/usr/local/bin:/usr/jbin/:/usr/bin:/usr/sas/bin
/usr/local/sbin:/sbin:/bin/:/usr/sbin:/usr/bin:/opt/omni/bin:
/opt/tools/bin:/opt/omni/sbin:/root/bin

Esempio 2 – sed / delimitatore:sostituisci /opt/omni/lbin con /opt/tools/bin

Quando dovresti usare '/' nella sostituzione relativa al nome del percorso, devi usare l'escape '/' nei dati di sostituzione come mostrato di seguito. In questo esempio, il delimitatore '/' è stato sottoposto a escape nella parte REGEXP e REPLACEMENT.

$ sed 's/\/opt\/omni\/lbin/\/opt\/tools\/bin/g' path.txt
/usr/kbos/bin:/usr/local/bin:/usr/jbin/:/usr/bin:/usr/sas/bin
/usr/local/sbin:/sbin:/bin/:/usr/sbin:/usr/bin:/opt/omni/bin:
/opt/tools/bin:/opt/omni/sbin:/root/bin

II. Sed '&' Ottieni stringa abbinata

La parte precisa di una riga di input su cui corrisponde l'espressione regolare è rappresentata da &, che può quindi essere utilizzata nella parte sostitutiva.

Esempio 1 – sed e utilizzo:sostituisci /usr/bin/ con /usr/bin/local

$ sed 's@/usr/bin@&/local@g' path.txt
/usr/kbos/bin:/usr/local/bin:/usr/jbin/:/usr/bin/local:/usr/sas/bin
/usr/local/sbin:/sbin:/bin/:/usr/sbin:/usr/bin/local:/opt/omni/bin:
/opt/omni/lbin:/opt/omni/sbin:/root/bin

Nell'esempio sopra '&' nella parte sostitutiva sostituirà con /usr/bin che corrisponde al modello e lo aggiungerà con /local. Quindi nell'output tutte le occorrenze di /usr/bin verranno sostituite con /usr/bin/local

Esempio 2 – sed &Usage:abbina l'intera linea

&sostituisce qualsiasi corrispondenza con il REGEXP specificato.

$ sed 's@^.*$@<<<&>>>@g' path.txt
<<</usr/kbos/bin:/usr/local/bin:/usr/jbin/:/usr/bin:/usr/sas/bin>>>
<<</usr/local/sbin:/sbin:/bin/:/usr/sbin:/usr/bin:/opt/omni/bin:>>>
<<</opt/omni/lbin:/opt/omni/sbin:/root/bin>>>

Nell'esempio sopra regexp ha "^.*$" che corrisponde all'intera riga. La parte di ricambio <<<&>>> scrive l'intera riga con <<>> rispettivamente all'inizio e alla fine della riga.

III. Raggruppamento e back-reference in Sed

Il raggruppamento può essere utilizzato in sed come una normale espressione regolare. Un gruppo viene aperto con "\(" e chiuso con "\)". Il raggruppamento può essere utilizzato in combinazione con il back-reference.

Il back-reference è il riutilizzo di una parte di un'espressione regolare selezionata per raggruppamento. I back-reference in sed possono essere utilizzati sia in un'espressione regolare che nella parte sostitutiva del comando sostitutivo.

Esempio 1:ottieni solo il primo percorso in ogni riga

$ sed 's/\(\/[^:]*\).*/\1/g' path.txt
/usr/kbos/bin
/usr/local/sbin
/opt/omni/lbin

Nell'esempio sopra, \(\/[^:]*\) corrisponde al percorso disponibile prima che arrivi first :. \1 sostituisce il primo gruppo abbinato.

Esempio 2:multiraggruppamento

Nel file path.txt cambia l'ordine dei campi nell'ultima riga del file.

$ sed '$s@\([^:]*\):\([^:]*\):\([^:]*\)@\3:\2:\1@g' path.txt
/usr/kbos/bin:/usr/local/bin:/usr/jbin:/usr/bin:/usr/sas/bin
/usr/local/sbin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/omni/bin:
/root/bin:/opt/omni/sbin:/opt/omni/lbin

Nel comando precedente $ specifica che la sostituzione deve avvenire solo per l'ultima riga. L'output mostra che l'ordine dei valori del percorso nell'ultima riga è stato invertito.

Esempio 3:ottieni l'elenco dei nomi utente nel file /etc/passwd

Questo esempio sed mostra solo il primo campo del file /etc/passwd.

$sed 's/\([^:]*\).*/\1/' /etc/passwd
root
bin
daemon
adm
lp
sync
shutdown

Esempio 4:metti tra parentesi il primo carattere di ogni parola

Questo esempio sed stampa il primo carattere di ogni parola tra parentesi.

$ echo "Welcome To The Geek Stuff" | sed 's/\(\b[A-Z]\)/\(\1\)/g'
(W)elcome (T)o (T)he (G)eek (S)tuff

Esempio 5:comunica il numero semplice.

Creiamo un file chiamato numeri che ha un elenco di numeri. L'esempio del comando sed di seguito viene utilizzato per comunicare i numeri fino alle migliaia.

$ cat  numbers
1234
12121
3434
123

$sed 's/\(^\|[^0-9.]\)\([0-9]\+\)\([0-9]\{3\}\)/\1\2,\3/g' numbers
1,234
12,121
3,434
123

Linux
  1. Tutorial Unix Sed:come eseguire più comandi Sed

  2. UNIX / Linux:10 esempi di comandi Netstat

  3. 10 Esempi di comandi Xargs in Linux / UNIX

  4. Esempi di comandi sed in Linux

  5. Sostituzione delle variabili d'ambiente in sed

Tutorial Unix Sed:come scrivere su un file usando Sed

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:7 esempi di operazioni Sed Hold e Pattern Buffer

Esercitazione Ping:15 esempi di comandi Ping efficaci

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