Sed

選擇行匹配模式,然後使用 sed 進行替換

  • February 26, 2022

這是我要複製的內容:

$ cat << EOF | { var=$(grep 'foo=');\
if (( $? == 0 )); then echo "$var"\
| sed -E 's/foo=(.+)/\1/'; else exit 1; fi; }
foo
foo=bar
EOF

酒吧

sed獨占使用:

$ cat << EOF | sed -nE '/foo=/p s/foo=(.+)/\1/'
foo
foo=bar
EOF

sed:-e 表達式 #1,字元 9:命令後的額外字元

錯誤的原因是什麼,如何解決?

你正在嘗試做

sed -n -E '/foo=/ s/foo=(.+)/\1/p' <<'END_INPUT'
foo
foo=bar
END_INPUT

您的命令p在初始地址(正則表達式foo=)之後有一個,這將其變成了一個完整的sed編輯命令(帶有抱怨的s/...尾隨垃圾),而不是命令的地址。sed``s

在上面的命令中,/foo=/是後續s命令的地址。該s命令將應用於與正則表達式匹配的每一行foo=。使其避免在每個循環後列印編輯緩衝區的-n選項sed,這就是我們使用該p標誌和s命令來列印修改的行的原因。

但是,您也可以將其寫為

sed -n '/foo=./ s/foo=//p' <<'END_INPUT'
foo
foo=bar
END_INPUT

它刪除了foo=每一行上的位,該foo=位後面有一個位。

或者,更簡短地說,通過讓s命令重用用作地址的正則表達式(然後顯然假設我們不需要在 之後有任何內容foo=),

sed -n '/foo=/ s///p' <<'END_INPUT'
foo
foo=bar
END_INPUT

或者,甚至更短,通過認識到該s命令不會更改與正則表達式不匹配的行,

sed -n 's/foo=//p' <<'END_INPUT'
foo
foo=bar
END_INPUT

或者,沒有-n,通過刪除所有不感興趣的行並僅修改感興趣的行並依賴於循環結束時的預設輸出,

sed -e '/foo=/!d' -e 's///' <<'END_INPUT'
foo
foo=bar
END_INPUT

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