Shell-Script
正則表達式模式通過 sed 替換多個值
我有一個腳本,我需要在其中解析本地主機的 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'