Como usar o sed para remover seletivamente os zeros à esquerda

3

Como posso substituir / remover 0 neste, usando sed :

2001:0db8:03cd:0000:0000:ef45:0006:0123

para que pareça assim:

2001:db8:3cd:::ef45:6:123

Existem 8 pedaços de 4's divididos por : no meio.

A primeira parte de 4 não deve perder qualquer 0 e das outras, apenas os principais 0's podem ser removidos.

    
por Pete 23.11.2014 / 23:51

4 respostas

8

Você deseja remover as execuções de 0 s, mas somente quando elas forem precedidas por dois pontos.

sed -e 's/:00*/:/g'
    
por 23.11.2014 / 23:56
3

Uma abordagem semelhante usando awk :

awk '{gsub(/:0*/,":")}1' file
2001:db8:3cd:::ef45:6:123
    
por 24.11.2014 / 00:05
3

Se você ainda estiver interessado em como remover qualquer zero, exceto os dos quatro primeiros dígitos, faça o seguinte:

sed 'H;g;s/\(\n\([^:]*\)\)*0*//g
' <<\IN
2001:0db8:03cd:0000:0000:ef0405:00060:0123
IN

OUTPUT

2001:db8:3cd:::ef45:6:123

Ok, então isso corresponde globalmente a zero ou mais sequências de uma nova linha, seguidas por zero ou mais caracteres não-cólon, ou zero ou mais zeros. A primeira sequência é dividida em dois subgrupos - um que inclui o \n ewline e outro que não. Aquele que faz é - mas o subgrupo que não o faz - e que o substitui - é . Então, o caractere extra \n ewline é descartado. E quaisquer zeros correspondidos que não estão nessa sequência não são salvos em todos - e então eles também são removidos.

A nova linha só é recuperada em primeiro lugar com H old - que acrescenta uma linha para manter espaço após um caractere \n ewline (que sempre começa vazia) - e, em seguida, g et - qual g ets h espaço antigo sobrescrevendo o espaço padrão.

    
por 24.11.2014 / 00:27
0

sed -r '/^..../s/:0+/:/g'

está bem? (Resposta melhorada de Gilles que mantém intocado os primeiros 4 caracteres)

    
por 24.11.2014 / 13:10