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

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

Спасибо.

  • Копирование / переименование нескольких файлов с использованием регулярного выражения (сценарий оболочки)
  • найти строки, которые не заканчиваются на «rpms» с sed
  • Удалить ведущее 0 из определенного поля
  • Извлечь строки из текстового файла на основе параметра в одну строку
  • sed шаблон, за которым следует один одиночный символ один или несколько раз
  • AWK / SED Удалить конкретную латексную команду из текста и закрывающей скобки за ней
  • Найдите наименьшие числа во втором столбце, соответствующие значениям индекса в первом столбце
  • Как удалить строки, где данная часть строки содержит более 100 символов?
  • 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 
    Interesting Posts

    systemd: запуск сервисов по запросу, таких как postgresql и mysql, которые еще не поддерживают активацию на основе сокетов

    Действительно ли Android использует то же ядро, что и Linux?

    Stunnel: как игнорировать дату истечения срока действия сертификата

    openbsd: поставщик mpls не передает пакеты

    Как проверить, является ли данный путь файлом или каталогом

    Запуск qsub на кластере через ssh

    Gmail мгновенный новый почтовый уведомитель для систем Debian 7?

    Вычисление времени ожидания ввода-вывода процессора в Solaris

    Понимание кодировки имени файла Unix

    как выбрать файлы в каталоге с булевым оператором AND

    Мой синтаксический анализатор работает в командной строке, но не из сценария

    Могу ли я использовать Grub на USB2.0 диске для загрузки загрузочного диска USB 3.1?

    dump directory data в файл для нового / модифицированного сравнения позже на сервере linux

    Как сделать сопоставления устройств после перезагрузки?

    Lintian сообщает не-dev-pkg-with-shlib-symlink, тогда как dh_auto_install делает эту ссылку

    Linux и Unix - лучшая ОС в мире.