Substituir caracteres na linha correspondente

2

Eu tenho algum texto com ip dentro dele. Eu gostaria de substituir cada dígito no ip que não é seguido por "SpecialWord" com algum outro caractere. Pode haver mais de um ip em cada linha.
Por exemplo:
Esta entrada
*random text with different numbers* 255.43.23.8 *some more text* "SpecialWord" 32.123.21.44 *text again*
Deve tornar-se *random text with different numbers* aaa.aa.aa.a *some more text* "SpecialWord" 32.123.21.44 *text again*
Eu tentei usar o sed -r 's/([0-9]{1,3}\.){3}[0-9]{1,3}/.../g'
mas eu não sei o número exato de dígitos no ip e o sed não pode fazer coisas antecipadas. O que pode me ajudar aqui?

    
por SomeGuy 19.03.2017 / 23:16

2 respostas

0

Não sei se o regexp consegue lembrar o comprimento do padrão, por isso, para uma solução sed (parcial) pura:

editar :

isso foi um pouco mais complicado.

Eu criei um arquivo sed a.sed

p
s/[0-9]\.[0-9]/a.a/g
s/with/phase 1/
p
s/[0-9]a\.a/aa.a/g
s/a\.a[0-9]/a.aa/g
s/phase 1/phase 2/
p
s/[0-9]aa.a/aaa.a/g
s/a.aa[0-9]/a.aaa/g
s/phase 2/final/

isso basicamente faz o mesmo que a linha de comando, mas com a linha de depuração.

  • primeira linha (- primeira linha, gire 1.2 para a.a (observe que o dígito no texto, como 1.12% , será transformado em a.a2% )
  • as próximas linhas se acumulam para IP de dois e três dígitos.) gire 1.2 para a.a (observe que o dígito no texto, como 1.12% , será transformado em a.a2% )
  • as próximas linhas são criadas para IP de dois e três dígitos.
  • remover linha com p e s/phase x/../ quando OK

use

sed -f a.sed u 

em que u é (sim, não é um IP válido, mas também não é esse o ponto)

*random text with different numbers* 255.43.23.8 *some more text* "SpecialWord" 32.123.21.44 *text again*
*random text with different 12* 255.4.2.8 *some more text* "SpecialWord" 32.12.21.44 *text again*
*random text with different 13* 255.453.263.788 *some more text* "SpecialWord" 2.123.21.454 *text again*
*random text with different 1.12%* 255.43.23.8 *some more text* "SpecialWord" 32.123.21.44 *text again*
*random text with different numbers* 5.43.23.8 *some more text* "SpecialWord" 32.3.1.44 *text again*

isso resultará em

*random text final different numbers* aaa.aa.aa.a *some more text* "SpecialWord" aa.aaa.aa.aa *text again*
*random text final different 12* aaa.a.a.a *some more text* "SpecialWord" aa.aa.aa.aa *text again*
*random text final different 13* aaa.aaa.aaa.aaa *some more text* "SpecialWord" a.aaa.aa.aaa *text again*
*random text final different a.aa%* aaa.aa.aa.a *some more text* "SpecialWord" aa.aaa.aa.aa *text again*
*random text final different numbers* a.aa.aa.a *some more text* "SpecialWord" aa.a.a.aa *text again*

edit2 : se você puder pagar um arquivo temporário

grep -Eo '[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}' u > v

obtenha uma lista de IP em v

sed s/[0-9]/a/g v > w

passe para o IP anônimo em w

paste -d '/' v w | sed -e 's|^.*$|s/&/|'

gera um arquivo sed que transforma o IP em um IP anônimo ...

paste -d '/' v w | sed -e 's|^.*$|s/&/|' | sed -f - u

... e aplique ao arquivo.

o resultado é o mesmo que acima, exceto para a linha com 1,12%

*random text with different 1.12%* aaa.aa.aa.a *some more text* "SpecialWord" aa.aaa.aa.aa *text again*

Suponhamos que você possa ter arquivos temporários e gostar de usar o míssil de cruzeiro para matar coelhos.

    
por 20.03.2017 / 15:39
0

A substituição incondicional de IPs pode ser feita com:

perl -pe 's!(\d+(\.\d+){3})! $1 =~s/\d/a/gr !ge' 

Explicação: substitua os IPs pelo resultado de (dígitos substitutos por "a")

Para proteger os IPs após "SpecialWord", marque os IPs com um "#" (e remova-o no final)

perl -pe 's/"SpecialWord"\s*\d+/$&#/; 
          ..... 
          s/#//'

Todos juntos:

perl -pe 's/"SpecialWord"\s*\d+/$&#/; 
          s!(\d+(\.\d+){3})! $1 =~s/\d/a/gr !ge;
          s/#//'   file
    
por 20.03.2017 / 20:48