パターンに一致する行を選択し、「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: コマンドの後の追加文字

エラーが発生したのはなぜですか?どうすれば修正できますか?

ベストアンサー1

あなたはしようとしています

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

あなたのコマンドはp最初のアドレス(正規表現)の後にあり、それはコマンドのアドレスの代わりに完全な編集コマンド(末尾のゴミとして表示されます)foo=に切り替わります。seds/...seds

上記のコマンドは/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

おすすめ記事