BASH - sed substituir variantes de IP

1

Faz algum tempo desde que eu postei uma pergunta aqui. Preciso de ajuda para conseguir que meu sed funcione. Eu tentei todos os tipos de formas de opções sed, mas parece que não consigo fazer isso funcionar. Eu tenho um arquivo que tem "192. *" por toda parte, e precisa de qualquer tipo de endereço IP que tenha qualquer semelhança com "192", todos apagados, mas preciso literalmente manter todo o resto. Algo que parece:

+ : root : 192.,local,10.
+ : root : local,192.
+ : root : local,192.,10.
+ : root : local,10.33.45.34,192.168.22.100
+ : root : local,192.168.22.100,10.33.45.34
+ : root : local,192.168
+ : root : local,192.168,10.

Item que eu tentei:

sed -e 's/,192.*$//g' -e 's/,192.*,//g' -e 's/192.,//g'
sed -e 's/,192.*$//' -e 's/,192.*,//' -e 's/192.,//' 
sed -e 's/,192.*$//' -e 's/,192.*,//' -e 's/192.*,//' 
sed -e 's/,192.*$//' -e 's/,192.*,//' -e 's/192.,//'

Eu quase enlouqueci, então alguma ajuda é apreciada.

Obrigado antecipadamente.

    
por drewrockshard 03.03.2017 / 04:05

2 respostas

2

Eu verifiquei este sed e está quase funcionando

sed -e 's/,\?192\(\.\([0-9]\{0,3\}\)\)\{0,3\},\?//g'

Como exemplo:

[batchhercules@hercules ~]$ cat example.txt | sed -e 's/,\?192\(\.\([0-9]\{0,3\}\)\)\{0,3\},\?//g'
+ : root : local,10.
+ : root : local
+ : root : local10.
+ : root : local,10.33.45.34
+ : root : local10.33.45.34
+ : root : local
+ : root : local10.

Como você pode ver na linha 3,5,7, ele está substituindo duas vírgulas, o que é ruim. Então, atualizado com:

sed -e 's/,192\(\.\([0-9]\{0,3\}\)\)\{0,3\}//g' -e 's/192\(\.\([0-9]\{0,3\}\)\)\{0,3\},//g'

O que para o seu exemplo funcionará muito bem:

[batchercules@hercules ~]$ cat example.txt | sed -e 's/,192\(\.\([0-9]\{0,3\}\)\)\{0,3\}//g' -e 's/192\(\.\([0-9]\{0,3\}\)\)\{0,3\},//g'
+ : root : local,10.
+ : root : local,10.134.
+ : root : local,10.
+ : root : local,10.33.45.34
+ : root : local,10.33.45.34
+ : root : local
+ : root : local,10.
    
por 03.03.2017 / 09:53
1

Minha sugestão: Use Perl.

Em que perl-test é um arquivo contendo os dados no OP:

$ perl -pe 's/(?:(\s)192.*?(?:,|$))|(?:,192.*?(,|$))/$1$2/g' perl-test 
+ : root : local,10.
+ : root : local
+ : root : local,10.
+ : root : local,10.33.45.34
+ : root : local,10.33.45.34
+ : root : local
+ : root : local,10.

Você pode facilmente catar o conteúdo e canalizá-lo para o perl -pe... .

A análise de expressão regular de Perl é muito parecida com sed, mas mais poderosa.

Explicação:

(?:) : o aumento do conteúdo dos parênteses com ?: torna a não captura grupo . Dessa forma, os parênteses que você usa apenas para agrupamento não afetam as variáveis de referência de referência $1 e $2 que você usa em sua sequência de substituição.

(\s) - Captura o espaço em branco a ser usado como $ 1 na string de substituição. Você deseja corresponder um endereço IP 192 precedido por espaços em branco para que você possa reconhecê-lo como o início da lista e manter a vírgula que o segue. Você ainda quer manter o espaço em branco.

192.*? - correspondência não voraz. Corresponde à vírgula NEXT. O comportamento padrão em Perl (e o comportamento ONLY em sed) é corresponder à vírgula LAST. Não é isso que você quer, e você veria uma diferença nas listas com mais de três endereços IP.

(?:,|$) - Grupo que não captura informando a correspondência não desejada para terminar na primeira vírgula ou no final da linha.

| - Obviamente, alterna para a próxima regex para corresponder.

,?192.*? - Correspondência não-gulosa para 192 que NÃO aparece no início de uma lista.

(,|$) - Assim como antes, combine a primeira vírgula após o endereço IP 192. Neste caso, você quer capturar a vírgula. Você quer mantê-lo desde que você se livrou da vírgula anterior com ,?192.*? e pode haver outro item na lista seguinte. É claro que, se NÃO houver outro item na lista após você, você corresponderá ao% de fim de linha$. Referenciar $ as $2 na string de substituição simplesmente não fará nada; referenciando , irá prepará-lo para o próximo item da lista. Então você está coberto de qualquer maneira.

Espero que isso faça algum sentido!

    
por 05.03.2017 / 02:34