
Como faço para substituir a seguinte string
hd_ma_prod_customer_ro:*:123456789:john.doe
com john.doe
Basicamente preciso procurar os últimos dois pontos (:) e deletar tudo antes e incluí-lo.
Responder1
Supondo que o que você realmente quer dizer é que deseja excluir tudo até o último dois pontos e deixar john.doe
intacto:
echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' |
sed 's/.*://'
Explicação:
A primeira linha apenas canaliza a string de teste para sed
fins de exemplo.
O segundo é básicosed
substituição. A parte entre o primeiro e o segundo /
é o regex a ser pesquisado e a parte entre o segundo e o terceiro é o que substituir (nada neste caso, pois estamos excluindo).
Para o regex, .
corresponde a qualquer caractere, *
repete isso quantas vezes quiser (incluindo zero) e :
corresponde a dois pontos. Então, efetivamente, é qualquer coisa seguida por dois pontos. Como .*
pode incluir dois pontos, a correspondência é 'ganancioso' e tudo até o último dois pontos é incluído.
Responder2
Outro método usando awk
:
awk -F: '{ print $NF }'
Responder3
sed -r 's/:/\t/g' filename | awk -F'\t' '{print $4}'
Estou substituindo todas as ocorrências de:com umabae depois usando awk
para extrair a string john.doe.
Se você não tiver um arquivo, você pode tentar isso.
echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' | sed -r 's/:/\t/g' |
awk -F'\t' '{print $4}'
De acordo com os comentários de Graeme, podemos awk
imprimir apenas a última coluna usando a NF
variável awk
abaixo.
echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' | sed -r 's/:/\t/g' | awk -F'\t' '{print $NF}'
Incorporando os comentários de Graeme para se livrar de coisas desnecessáriassed
O comando pode ser modificado conforme abaixo.
echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' | awk -F':' '{print $NF}'
Responder4
Tente por favor
echo 'abc:fjk' |sed 's/.*:/john.doe/g'
e para excluir
echo 'abc:fjk' |sed 's/.*://g'