use sed no shell script para substituir o endereço IP em um arquivo

2

Eu tenho um script que encontra uma string em um arquivo que a substitui por uma nova string.

$ sed -i 's/$old_string'/'$new_string'/g' $FILENAME

Agora, preciso que a condição seja uma expressão regular que também verifique se a string antiga é seguida com qualquer coisa, menos com um número.

Eu tentei isso, mas não funcionou:

$ sed -i -r 's/$old_string(^[0-9])+/$new_string/g' $FILENAME

Alguma ideia?

    
por edotan 18.04.2012 / 11:29

1 resposta

6

Para negar um intervalo em uma expressão regular, o cursor deve estar dentro dos colchetes.

sed -i -r 's/$old_string([^0-9])+/$new_string/g' $FILENAME

Os parênteses também são desnecessários, neste caso, se você não estiver usando referências anteriores (e não parece que você é.)

sed -i -r 's/$old_string[^0-9]+/$new_string/g' $FILENAME

Uma última coisa: o bash não analisa variáveis dentro de aspas simples, então $old_string e $new_string não serão substituídos por nenhuma variável bash que você tenha definido em seu script, mas será usado literalmente nesse sed comando. Se você usar aspas duplas, elas serão substituídas.

sed -i -r "s/$old_string[^0-9]+/$new_string/g" $FILENAME

Atualização:

Como o arquivo não contém qualquer coisa após a string que você deseja substituir, a parte [^0-9]+ da regex não tem nada a combinar. Funcionaria se houvesse um espaço após o endereço IP. Podemos combinar o final da linha com $ .

sed -i -r 's/123.123.123.1$/4.4.4.4/g' $FILENAME

Mais uma atualização. Este combina com qualquer personagem que não seja um número ou nenhum personagem. Para isso, precisamos dos parênteses para agrupar as duas opções.

sed -i -r 's/123.123.123.1([^0-9]+|$)/4.4.4.4/g' $FILENAME

Como temos os parênteses, você pode usar uma referência anterior para incluir o que foi correspondido:

sed -i -r 's/123.123.123.1([^0-9]+|$)/4.4.4.4/g' $FILENAME
    
por 18.04.2012 / 11:54