Шаблон 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 ниже.

Просто добавьте 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 ).