Сопоставьте целое слово (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" 

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

Спасибо.

  • Как печатать одинаковые строки несколько раз с переменными, измененными с помощью Sed / Awk / anything?
  • Замените экземпляры слов своим прикрепленным к нему числом
  • SED переключающие столбцы в одном файле, ограниченном,
  • Как совместить точную строку с помощью `sed`? Но не его часть.
  • Удалить строки из файла с помощью awk или sed на основе переменной из предыдущей команды
  • Как удалить каждую вторую строку из файла?
  • Как вставить текст после определенной строки в файл?
  • Замените в верхнем регистре на нижний регистр, кроме первой буквы каждого слова в определенной строке
  • 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 
    Linux и Unix - лучшая ОС в мире.