Excluir até a primeira ocorrência de cólon usando sed

14

Meu comando sed é

 sed '/(.*:)/d' <<< 'abcd:bcde:cdeaf'

Deve retornar,

bcde:cdeaf

(i.e.) todos os caracteres antes do primeiro cólon na linha e o próprio cólon devem ser removidos.

Mas isso não está removendo nada.

Minha confusão surge principalmente devido a

1) Os parêntesis para correspondência de padrões precisam ser escapados dentro das expressões regulares?

2) Em ambos os casos (com escape / não escapeamento), não está funcionando. Eu tentei,

sed -E '/\(.*:\)/d' <<< 'abcd:bcde'
    
por Madhavan Kumar 29.09.2015 / 04:27

2 respostas

18
$ echo 'abcd:bcde:cdeaf' | sed 's/^[^:]*://g'
bcde:cdeaf

O primeiro ^ significa o início da linha. O [^:] é apenas a única maneira que eu sei escrever não um cólon . O * após o cólon significa qualquer número das coisas antes de mim (neste caso, o não-cólon). Finalmente, o : seleciona os dois pontos.

Em outras palavras, selecione o início da linha, qualquer número de itens que não sejam dois pontos e o primeiro cólon.

O //g significa excluir todas as ocorrências correspondentes.

    
por 29.09.2015 / 04:34
5

Para operar com colunas, há cut :

echo 'abcd:bcde:cdeaf' | cut -d: -f2-

same do

echo 'abcd:bcde:cdeaf' | cut -d: -f1 --complement

E outra versão com sed (mais rápida para big data):

echo 'abcd:bcde:cdeaf' | sed 's/^://;t;s/:/\n:/;D'

E bastante exótico em bash

echo 'abcd:bcde:cdeaf' | { IFS=: read -r first last ; echo "$last" ; }

ou

echo 'abcd:bcde:cdeaf' | { read -r line ; echo ${line#*:} ; }

ou

echo 'abcd:bcde:cdeaf' | { IFS=: read -a a ; printf '%b:' "${a[@]:1}\c" ; echo ;}
    
por 29.09.2015 / 11:17

Tags