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