
私が複製したいものは次のとおりです。
$ 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: コマンドの後の追加文字
エラーが発生したのはなぜですか?どうすれば修正できますか?
答え1
あなたはしようとしています
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