Come usare Sed per sostituire tutti i personaggi prima dei due punti?


25

Come posso sostituire la seguente stringa

hd_ma_prod_customer_ro:*:123456789:john.doe

con john.doe

Fondamentalmente ho bisogno di cercare gli ultimi due punti (:) ed eliminare tutto prima e includendolo.

Risposte:


40

Supponendo che cosa realmente intendi è che vuoi eliminare tutto fino agli ultimi due punti e lasciare john.doeintatto:

echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' |
  sed 's/.*://'

Spiegazione:

La prima riga esegue il pipe della stringa di test solo a sedscopo di esempio.

Il secondo è una sedsostituzione di base . La parte tra il primo e il secondo /è la regex da cercare e la parte tra il secondo e il terzo è ciò con cui sostituirlo (nulla in questo caso mentre stiamo eliminando).

Per la regex, .corrisponde a qualsiasi personaggio, lo *ripete un numero qualsiasi di volte (incluso zero) e :corrisponde ai due punti. Così efficacemente è tutto seguito da due punti. Dal momento che .*può includere due punti, la partita è "golosa" e tutto è incluso fino all'ultimo punto.


7
sed -r 's/:/\t/g' filename | awk -F'\t' '{print $4}'

Sto sostituendo tutte le occorrenze di : con una scheda e quindi usando awkper estrarre la stringa john.doe.

Se non hai un file, puoi provare questo.

echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' | sed -r 's/:/\t/g' | 
awk -F'\t' '{print $4}'

Secondo i commenti di Graeme possiamo usare awkper stampare solo l'ultima colonna usando la NFvariabile di awkcome sotto.

echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' | sed -r 's/:/\t/g' | awk -F'\t' '{print $NF}'

Incorporando i commenti di Graeme per sbarazzarsi di inutili sed

Il comando può essere modificato come di seguito.

echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' | awk -F':' '{print $NF}'

1
Se hai intenzione di usare awk, perché non farlo awk -F:?
Graeme,

@Graeme, non mi sento ancora a mio agio awk. Fondamentalmente, provo a testare i comandi che originariamente ho ricevuto nella mia risposta e provo a modificarli in base alle esigenze dell'utente. :)
Ramesh,

3
L' -Fopzione per awkspecifica il separatore di campo. Se si dice awkdi usare i due punti, non è necessario sostituire i due punti con le schede. Inoltre, se si desidera ottenere l'ultimo campo che è possibile utilizzare al $NFposto di $4, funzionerebbe se non ci sono sempre 3 punti.
Graeme,

@Graeme, ho incorporato le modifiche che hai citato. Per favore fatemi sapere se va bene :)
Ramesh,

Sì, funziona perfettamente!
Graeme,


2

Vi preghiamo di provare

modifica: ancora rimossa

echo 'abc:fjk' |sed 's/.*:/john.doe/g'

e per cancellare

echo 'abc:fjk' |sed 's/.*://g'

non è quello che l'OP chiede
iruvar,

rileggi nuovamente la domanda.
Akash


Oh, capisco . le mie scuse 1_CR
akash

1
L' ^ancoraggio non fa alcuna differenza nel caso della domanda o nel tuo esempio. Qualsiasi indirizzo che inizia con /.*implica già il ^.
Mikeserv,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.