Shell-Script

正則表達式模式通過 sed 替換多個值

  • June 5, 2016

我有一個腳本,我需要在其中解析本地主機的 IP 地址,並用不同的值替換第二個八位字節,但要替換的值取決於目前的值是什麼……

例如,如果 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'

引用自:https://unix.stackexchange.com/questions/287283