Como usar o Sed para substituir todos os caracteres antes dos dois pontos?


25

Como substituo a seguinte string

hd_ma_prod_customer_ro:*:123456789:john.doe

com john.doe

Basicamente, eu preciso procurar o último dois pontos (:) e excluir tudo antes e incluí-lo.

Respostas:


40

Supondo que você realmente queira dizer é que deseja excluir tudo até o último dois pontos e deixar john.doeintacto:

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

Explicação:

A primeira linha apenas envia a cadeia de teste sedpara fins de exemplo.

A segunda é uma sedsubstituição básica . A parte entre o primeiro e o segundo /é o regex a ser pesquisado e a parte entre o segundo e o terceiro é o que substituí-lo (nada neste caso, como estamos excluindo).

Para a regex, .corresponde a qualquer caractere, *repete isso várias vezes (incluindo zero) e :corresponde a dois pontos. Tão efetivamente é qualquer coisa seguida por dois pontos. Como .*pode incluir dois pontos, a correspondência é "gananciosa" e tudo até o último dois pontos é incluído.


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

Estou substituindo todas as ocorrências de : por uma guia e, em seguida, usando awkpara extrair a sequência john.doe.

Se você não possui um arquivo, 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 usar awkpara imprimir a última coluna sozinha, usando a NFvariável awkabaixo.

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 desnecessários sed

O comando pode ser modificado como abaixo.

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

11
Se você vai usar awk, por que não usar awk -F:?
Graeme

@ Graeme, eu ainda não estou tão confortável com isso awk. Basicamente, tento testar os comandos que obtive originalmente na minha resposta e modificá-los de acordo com os requisitos do usuário. :)
Ramesh

3
A -Fopção para awkespecifica o separador de campos. Se você disser awkpara usar dois pontos, não será necessário substituir os dois pontos por guias. Além disso, se você deseja obter o último campo que pode usar em $NFvez de $4, isso funcionaria se nem sempre houver três pontos.
Graeme

@ Graeme, eu incorporei as alterações que você mencionou. Por favor, deixe-me saber se isso é bom :)
Ramesh

Sim, funciona perfeitamente!
Graeme


2

Tente por favor

editar: âncora removida

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

e excluir

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

não é isso que o OP pedindo
Iruvar

releia a pergunta novamente.
akash

Bem, você sorrateiramente no apagar depois do meu comentário, não importa
Iruvar

Ah eu vejo . minhas desculpas 1_CR
akash

11
A ^âncora não faz diferença no caso da pergunta ou no seu exemplo. Qualquer endereço que comece com /.*já implica em ^.
mikeserv
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.