Шаблон Regex для замены нескольких значений с помощью sed

У меня есть сценарий, в котором мне нужно проанализировать IP-адрес localhost и заменить второй октет другим значением, но заменяемое значение зависит от того, какое значение в настоящее время …

Например, если IP 10.10.100.6 , тогда мне нужен результат 10.20.100.6 , а если IP 10.20.100.6 , тогда мне нужен результат 10.10.100.6

Я попробовал следующее:

nmcli con show eno16777984 | grep -E '^ipv4.address' | awk -F"/|[[:space:]]+" '{print $2}' | sed -e 's/^10\.10\./10.20./; s/^10\.20\./10\.10\./' 

И проблема, с которой я сталкиваюсь, заключается в том, что замены sed происходят, чтобы они были установлены в команде. Таким образом, результат всегда 10.10 ….

Есть ли способ изменить значения sed только в том случае, если текущее значение соответствует шаблону?

Благодаря!

PS Это должен быть короткий и простой один лайнер, так как эта строка кода будет выполняться путем замены в нескольких местах, и кто бы это ни был, будет иметь ограниченный опыт / знания, поэтому будет просто копироваться и вставляться из документа.

Обновить

Я выяснил, как это сделать через awk :

 nmcli con show eno16777984 | grep -E '^ipv4.address' | awk -F"/|[[:space:]]+" '{print $2}' | awk -F. '{print $1"."($2 == "10" ? "20" : "10")"."$3"."$4}' 

Но есть некоторые хорошие и простые ответы, показывающие, как это сделать в sed ниже.

3 Solutions collect form web for “Шаблон Regex для замены нескольких значений с помощью sed”

Просто добавьте t; ,

 sed -e 's/^10\.10\./10.20./;t;s/^10\.20\./10\.10\./' 

Это завершается успешно. Но вы должны действительно объединить все эти grep, awk, sed в один awk.

Чтобы обменять две строки, используйте временную третью строку, которая не будет изменена другим способом.

 sed -e 's/^10\.10\./10.foo./g; s/^10\.20\./10.10./g; s/^10\.foo\./10.20./g' 

Там нет необходимости тратить grep или sed на awk , или awk на awk здесь. awk может сделать все это за один проход:

 nmcli con show eno16777984 | awk -F"/|[[:space:]]+" ' /^ipv4.address/ { if ($2 ~ /^10\.10/) { sub(/10\.10/,"10.20",$2); } else if ($2 ~ /^10\.20/) { sub(/10\.20/,"10.10",$2); }; }; 1' к nmcli con show eno16777984 | awk -F"/|[[:space:]]+" ' /^ipv4.address/ { if ($2 ~ /^10\.10/) { sub(/10\.10/,"10.20",$2); } else if ($2 ~ /^10\.20/) { sub(/10\.20/,"10.10",$2); }; }; 1' к nmcli con show eno16777984 | awk -F"/|[[:space:]]+" ' /^ipv4.address/ { if ($2 ~ /^10\.10/) { sub(/10\.10/,"10.20",$2); } else if ($2 ~ /^10\.20/) { sub(/10\.20/,"10.10",$2); }; }; 1' 

В строках, начинающихся с ipv4.address , если второе поле начинается с 10.10 , замените его на 10.20 или если оно начинается с 10.20 , замените его на 10.10 . Распечатайте все строки, были ли они изменены или нет. ( 1 является ярлыком awk – 1 всегда оценивает значение true, а действие по умолчанию – печатать … эта строка эффективна, if true then print the current line ).

  • Удалить комментарии в файле C
  • Частично удалить форматирование из текста в буфер обмена
  • Как сопоставить шаблон и заменить только часть шаблона?
  • Как выбрать последнее число в строке в сценарии bash
  • Как я могу сопоставить и заменить этот многострочный шаблон в сценарии bash?
  • Использование 'sed' для поиска и замены
  • Полосы пробелов после одиночных заглавных букв с sed
  • Получить строку запроса из URL-адресов в файле журнала
  • Grep для нескольких строк, покажите количество строк после одной из строк (но не другой)
  • sed: захват и замена всех данных между последней обратной косой чертой и запятой
  • Редактируйте несколько строк из определенного раздела INI-файла
  • Interesting Posts

    Что может быть неправильным, когда команды mkdir, file и touch выдают сообщения об ошибках

    Настройки DNS для каждого пользователя для VPN

    Задачи Cron на втором 26?

    дистанционное управление vlc с использованием скрипта через ssh

    Инструмент для экранирования всех кавычек в строке / файле

    Поднимите все окна терминала перед экраном?

    Проблема с установкой phpmyadmin

    Какой файл монтируется в loop0?

    Найдите номер строки, который содержит шаблон, используя специальный разделитель регулярных выражений

    xtightvnc через ssh gateway – соединение отказано

    CUPS: Невозможно установить параметр для алгоритма полутонов после обновления от сжатия Debian до wheezy

    Как печатать буквы «block» в терминале?

    Не удалось выполнить попытку аренды IP-адреса DHCP через Ethernet и dhcp с netctl

    Я хочу изменить корневые файлы, а также создавать файлы без root в одном сеансе текстового редактора.

    Почему синтаксис «установить» не работает для выделения синтаксиса в vim?

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