web-dev-qa-db-ja.com

sedコマンドの-eの目的は何ですか?

sed-eスイッチに関するドキュメントが見つかりません。単純な置換の場合、必要ですか?

例えば.

sed 's/foo/bar/'

VS

sed -e 's/foo/bar/'
46
Howard

Manページから:

-e script, --expression=script

    add the script to the commands to be executed

したがって、複数の-e多くの部分からスクリプトを構築するためのオプション。

$ sed -e "s/foo/bar/" -e "/FOO/d"

最初にfoobarに置き換え、次にFOOを含むすべての行を削除します。

32
user16144

これはあなたのために働くかもしれません:

sed -e '/foo/i\' -e 'bar' -e '/fred/a\' -e 'barny' -e '/harry/c\' -e 'potter' file

いずれの場合も、i(挿入)、a(追加)およびc(変更)コマンドは改行で終了する必要があります。

通常、コマンドは;で区切ることができます。 /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
27
potong

-e、 に相当 --expressionは、別の Answer に示されているように、いくつかの式を一緒に(一般的ではありません)ストリングする場合を除き、オプションです。

余談:;を同じ式で代わりに使用して、複数の式を順番に実行できます。

1
flow2k

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によって実行されるscriptです。 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>を使用して、コマンドにスクリプトを追加することができます。

N.B.他の回答では、複数のスクリプトを使用する代わりに;を使用することが提案されています。これは技術的に可能である場合もありますが、コードが非常に読みにくくなるため、お勧めできません。ここに例を示します: https://www.grymoire.com/Unix/Sed.html#uh-61

1
BakaKuna