Não substitua a segunda ocorrência do padrão em uma mesma palavra no arquivo com o comando sed

0
echo "abcdef12cade 12345678 abcdefba12345678" | sed -E "s/[0-9a-fA-F]{8}/00000000/g" 

as saídas acima são as seguintes

00000000cade 00000000 0000000000000000

está substituindo o padrão para a segunda ocorrência em uma mesma palavra. Eu não quero substituir se houver uma segunda ocorrência.

saída esperada

00000000cade 00000000 abcdefba12345678
    
por hidayath 21.06.2018 / 17:32

3 respostas

3

Se você deseja substituir apenas a primeira ocorrência de uma correspondência, não use o sufixo g para o comando:

$ echo 'aa' | sed 's/a/b/g'
bb
$ echo 'aa' | sed 's/a/b/'
ba

A opção g significa 'global', que informa explicitamente sed para substituir todas as correspondências e não apenas a primeira (que é o comportamento padrão).

    
por 21.06.2018 / 17:38
1

Parece que você está procurando palavras entre 8 e 15 caracteres e substitua os oito primeiros dígitos hexadecimais:

sed -E 's/\<[[:xdigit:]]{8}([[:xdigit:]]{0,7})\>/00000000/g' <<END
abcdef12cade 12345678 abcdefba12345678 12345 123456789
END
00000000cade 00000000 abcdefba12345678 12345 000000009

Onde, \< e \> são limites de palavras e [:xdigit:] corresponde a um dígito hexadecimal.

    
por 21.06.2018 / 18:03
0

O g no final faz com que sed repita a substituição quantas vezes for possível na linha. Você só quer fazer isso duas vezes.

Vamos fazer isso com o GNU awk :

echo 'abcdef12cade 12345678 abcdefba12345678' |
awk '{ sub("[0-9a-fA-F]{8}", "00000000", $1)
       sub("[0-9a-fA-F]{8}", "00000000", $2)
       print }'

Isso realiza a substituição apenas nos dois primeiros campos delimitados por espaço em branco e, em seguida, imprime a linha resultante.

    
por 21.06.2018 / 17:52