回答:
これはあなたのために働くかもしれません:
sed -e '/foo/i\' -e 'bar' -e '/fred/a\' -e 'barny' -e '/harry/c\' -e 'potter' file
いずれの場合も、i(挿入)、a(追加)、c(変更)コマンドは改行で終了する必要があります。
通常、コマンドは;eg で区切って} egで/foo/d;/bar/dグループ化できますが、コマンドの場合はコマンドを区切る方法を提供します。{.../foo/{h;d}i,a,c-e
別の方法は、shell(bash)を使用して改行を挿入することです。
sed '/foo/i\bar'$'\n''/fred/a\barney'$'\n''/harry/c\potter' file
-eセミコロンではなくnewlines /を使用してラベルとブランチコマンドを終了する必要もあります。これは動作しません:sed ':a; /x/ { s/x/y/g; ba }; q' <<< "jxm"。しかし、これは:sed -e ':a' -e '/x/ { s/x/y/g; ba' -e '}; q' <<< "jxm"
must be terminated with a newlineここでこのフレーズがどの程度必要かはわかりません。私がここでテストしたときcygwin、これは動作します:sed '/foo/i\bar' file。個別の式を1つに融合できるようになったので、これは元の質問に再び浮上します:の本当の目的は何-eですか?
sedあなたのためのヘルプでは、-eフラグが次の略であることがわかります:
-e script, --expression=script
add the script to the commands to be executed
しかし、あなたは遭遇した後で混乱する最初の人ではありません-e。あなたの例sed 's/foo/bar/'でsed -e 's/foo/bar/'は、同等です。どちらの場合s/foo/bar/も、sedによって実行されるスクリプトです。2番目のオプションはより明確ですが、それがおそらくよく-e使用される理由ではありません。その理由は-e、同じ呼び出しで複数のスクリプトを使用できるようにするためですsed。1つのスクリプトのみを使用している場合、なぜそれを使用するのかという疑問が残りますか?次の例で説明できます。
echo "foo" | sed -e 's/foo/bar/' -e 's/bar/foo'
「foo」を出力します。
しかしながら、
echo "foo" | sed 's/foo/bar/' -e 's/bar/foo'
sed最初s/foo/barのファイル名として解釈するようになったため、失敗します。したがって、将来の生活を楽にするために、すでに-eフラグを今日から使い始めることができます。そうすれば、を使用してコマンドに追加のスクリプトを追加できます-e <script>。
NB他の回答で;は、複数のスクリプトを使用する代わりに使用することが提案されています。場合によっては技術的には可能ですが、コードを読むのが非常に難しくなるため、推奨されません。こちらの例をご覧ください:https : //www.grymoire.com/Unix/Sed.html#uh-61
man sedか?