Como usar o Sed para substituir todos os caracteres antes do cólon?

25

Como substituo a seguinte string

hd_ma_prod_customer_ro:*:123456789:john.doe

com     john.doe

Basicamente eu preciso procurar os últimos dois pontos (:) e excluir tudo antes e incluí-lo.

    
por yihyoon 12.06.2014 / 18:24

4 respostas

40

Assumir o que você realmente quer dizer é que deseja excluir tudo dos últimos dois pontos e deixar o john.doe intact:

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

Explicação:

A primeira linha apenas canaliza a string de teste para sed , por exemplo.

A segunda é uma sed substituição básica. A parte entre o primeiro e o segundo / é o regex para procurar e a parte entre o segundo e o terceiro é para substituí-lo (nada neste caso, pois estamos excluindo).

Para o regex, . corresponde a qualquer caractere, * repete esse número qualquer (incluindo zero) e : corresponde a dois pontos. Então, efetivamente, é qualquer coisa seguida por dois pontos. Como .* pode incluir dois pontos, a correspondência é "gulosa" e tudo até os últimos dois pontos é incluído.

    
por 12.06.2014 / 18:35
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 awk para extrair a string john.doe.

Se você não tiver um arquivo, poderá 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 awk para imprimir a última coluna sozinha usando a variável NF de awk conforme 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 do sed desnecessário

O comando pode ser modificado como abaixo.

echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' | awk -F':' '{print $NF}'
    
por 12.06.2014 / 18:34
5

Outro método usando awk :

awk -F: '{ print $NF }'
    
por 13.06.2014 / 04:57
2

Por favor, tente

edit: âncora removida

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

e para excluir

echo 'abc:fjk' |sed 's/.*://g'
    
por 12.06.2014 / 18:33

Tags