Сопоставьте целое слово (IP-адрес) с помощью `sed`

У меня есть следующий стиль строки в файле:

1.2.3.4 1.2.3.4a 1.2.3.45 iaa1.2.3.4ad 11.2.3.4a a1.2.3.4 1.2.3.4> <1.2.3.4> <"1.2.3.4"> 1.2.3.4 hostname 

Я хочу заменить все ip ' 1.2.3.4 ' на другой ip, например, « 9.8.7.6 », в том числе на <> и в «», и с буквой, предшествующей или сопровождаемой ip.

Но НЕ « 11.2.3.4 » или « 1.2.3.45 »,

Таким образом, пункты 1.2.4.6.7.8.9.10 совпадают.

Примечание: «1.2.3.4» – это просто пример, это может быть любой допустимый ips.

Я хочу использовать sed для замены 1.2.3.4 другим ip.

Я не знаю, как написать команду sed .

 sed "s/oldip/newip/g" 

Я немного знаю о регулярном выражении, но для меня это кажется слишком сложным.

Спасибо.

2 Solutions collect form web for “Сопоставьте целое слово (IP-адрес) с помощью `sed`”

Если вы используете современное седло, следующие работы:

 sed -e 's/\(^\|[^0-9]\)1\.2\.3\.4\($\|[^0-9]\)/\1NEWIP\2/' 

NEWIP есть, замените 1.2.3.4 на NEWIP , если в начале строки или предшествует не цифра, а если дополнительно в конце строки или за ней следует не цифра.

С старой версией sed, которая не поддерживает расширенные регулярные выражения, это сложнее. Вы можете это сделать, например, используя символы маркировки. Нам нужны два символа, которые гарантированно не будут присутствовать на входе. В приведенном ниже решении я использую и : здесь, но любые другие символы будут делать, даже управляющие символы.

 sed -e 's/\(1\.2\.3\.4\)/,\1:/;s/\([0-9]\),/\1/;s/:\([0-9]\)/\1/;s/,.*:/NEWIP/;s/[,:]//' 

Сначала мы вставляем перед и : после шаблона, который хотим заменить; то мы удаляем , если ему предшествует цифра и : если за ним следует цифра; то мы заменяем строку с : (если все еще присутствуем) на заменяющую строку; наконец, удалим оставшиеся или :

С perl можно было бы также использовать отрицательное прогнозное утверждение (?!\d) и отрицательное утверждение look-behind (?<!\d) чтобы убедиться, что шаблон соответствует только если не предшествует или не следует цифрой:

 perl -pe 's/(?<!\d)1\.2\.3\.4(?!\d)/NEWIP/;' 

Вы не сказали, что хотите сделать с линиями, которые не содержат действительного IP-адреса, поэтому я предполагаю, что вы просто хотите их игнорировать. Затем все, что вам нужно сделать, это убедиться, что вся строка соответствует трем группам из одного-трех чисел ( [0-9]{1,3} ), а затем заключительная группа из одного-трех чисел. Вот три способа сделать это:

  • GNU sed

     sed -r 's/^([0-9]{1,3}\.){3}[0-9]{1,3}$/5.6.7.8/' file 
  • Не-GNU sed

     sed 's/^\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}$/5.6.7.8/' file 
  • Perl

     perl -pe 's/^(\d{1,3}\.){3}\d{1,3}$/5.6.7.8/' file 
  • Способ вставки определенного столбца, когда в терминале
  • Замените указанную строку на время ее появления с помощью sed или awk
  • Как удалить содержимое перед шаблоном в XML с помощью Unix
  • Как редактировать файлы на месте при выполнении операции над значениями, соответствующими найденному шаблону?
  • Как я могу запустить sed для замены строк в файле или делать подобные вещи в PHP?
  • Использование awk и grep для результатов iftop
  • Вставка в середину строки с помощью sed
  • Как заменить только N-е вхождение шаблона в файл?
  • Измените текст в теге, но только тег содержится в определенном блоке XML
  • сравнение строк с awk vs во время чтения строки
  • Вставить текст внутри строки в конце строки данных
  • Linux и Unix - лучшая ОС в мире.