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!