Sed選擇行匹配模式,然後使用
選擇行匹配模式,然後使用 sed
進行替換
這是我要複製的內容:
$ 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