Se você usa um sed moderno, o seguinte funciona:
sed -e 's/\(^\|[^0-9]\)1\.2\.3\.4\($\|[^0-9]\)/NEWIP/'
Ou seja, substitua 1.2.3.4
por NEWIP
, se no início da linha ou precedido por um não dígito, e se adicionalmente no final da linha ou seguido por um não dígito.
Com uma versão antiga sed que não suporta regexps estendidos, é mais complicado. Você pode fazer isso, por exemplo, usando caracteres de marcação. Precisamos de dois caracteres com garantia de não ocorrerem na entrada. Na solução abaixo, eu uso ,
e :
aqui, mas qualquer outro caractere serve, até mesmo caracteres de controle.
sed -e 's/\(1\.2\.3\.4\)/,:/;s/\([0-9]\),//;s/:\([0-9]\)//;s/,.*:/NEWIP/;s/[,:]//'
Primeiro, inserimos ,
antes e :
após o padrão que queremos substituir; em seguida, excluímos ,
se precedido por um dígito e :
se seguido por um dígito; então substituímos a string de ,
to :
(se ainda estiver presente) pela string de substituição; finalmente, excluímos qualquer ,
ou :
restante.
Com o perl, também é possível usar uma asserção de look-ahead negativo (?!\d)
e uma asserção negativa de look-behind (?<!\d)
para garantir que o padrão corresponda apenas se não precedido ou seguido por um dígito:
perl -pe 's/(?<!\d)1\.2\.3\.4(?!\d)/NEWIP/;'