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