Substituir caracteres arbitrários no meio de uma string de endereço IP com sed

1

Eu preciso encontrar e substituir um ou dois caracteres numéricos em strings em um arquivo. As strings são endereços IP do formulário:

10.xx.y.z 

Em que xx pode ser um ou dois caracteres.

Eu quero substituir o xx pelo caractere único 0 , então tenho

10.0.y.z 

preservando os valores de y e z .

A string pode aparecer várias vezes no arquivo. Qual é a invocação sed para fazer isso?

    
por John Hupcey 10.09.2015 / 23:00

3 respostas

2

n=[:digit:] o="[$n]\{1,3\}\."

sed -e"s/^/ /" \
    -e"s/\([^.$n]$o\)$o\($o${o%.})/./g" \
    -e"s/.//" \
<in >out

Ele não restringe os octetos a 8bits, e não restringe a última octeto a três dígitos, mas pode ser bom o suficiente.

Se você deseja editar o arquivo no local, a melhor maneira de fazê-lo (em oposição a usar a opção -i em perl ou algum sed s) é primeiro obter uma cópia temporária do arquivo, editá-lo e depois gravar a cópia temporária editada em seu original. A maioria dos shells (incluindo bash e zsh ) fornecerão um arquivo temporário seguro automaticamente quando você solicitar um documento aqui:

sed -e"#...script..." \
<<IN  >infile
$(cat <infile)
IN

O texto acima deixará todas as linhas em branco à direita infile se houver alguma, mas existem várias outras respostas neste site que demonstram como preservá-las também, se você precisar. Ele também não manipula bytes nulos, o que é um problema mais difícil de resolver sem zsh .

    
por 11.09.2015 / 00:04
0

Assumindo (como especificado) que o arquivo é composto de string e string IP

com 1 IP por linha

sed 's/.[^.]*/0/' YourFile

Com vários IP por linha

sed 's/\([0-9]\{1,3\}[.]\)[^.]*\(\([.][[:alnum:]]\{1,\}\)\{2\}\)/.0/g' YourFile
    
por 16.09.2015 / 09:41
0

Isso funciona:

o="[[:digit:]]\{1,3\}"  
sed  -e"s/10\.$o\.\($o\.$o\)/10.0./g" <input.txt >output.txt

Modifica 10.X.y.z para 10.0.y.z em qualquer posição em um arquivo, mesmo várias vezes na mesma linha. Não mexa com strings arbitrárias da WWW.x.y.z.

    
por 05.11.2015 / 16:07