「sed -e」と複数のコマンドをセミコロンで区切ることの違い

「sed -e」と複数のコマンドをセミコロンで区切ることの違い

私があちこちで叫んでいるかもしれませんが、私を悩ませていたこの質問が一度に答えを得てほしいです...

以下を表すテキストファイル:

Line one.
Line two.

Line three.
Line four.

sedこのテキストファイルに空行を一貫して追加するには、1行につき2つのコマンドが必要です。これは、次の構文のいずれかを使用して達成できます。

  1. sed -e '/^$/d' -e '$!G' <file>...しかしそうではありません(sed -e '/^$/d' '$!G' <file>またはsed '/^$/d' '$!G' <file>
  2. sed -e '/^$/d; $!G' <file>またはsed -e '/^$/d ; $!G' <file>
  3. sed '/^$/d; $!G' <file>またはsed '/^$/d ; $!G' <file>

私の質問は次のとおりです

  1. 上記の5つの作業構文の間に実際の違い(一般性、コンプライアンスか...)がありますか?
  2. リチャード・ブルームの最新作コマンドラインとシェルスクリプト聖書sed -e 's/brown/red/; s/dog/cat/' data1.txt次のアドバイスをする前に、このようなものを使用するように言います。

コマンドはセミコロン(;)で区切る必要があり、最初のコマンドの終わりとセミコロンの間にはスペースを入れないでください。

-e...その後、オプションをまったく使用せずにコマンドの終わりとセミコロンの間にスペースを追加するなど、自分のアドバイスを完全に無視します(上記の#3の2番目のバリエーションのように)。セミコロンの周りの間隔は実際の違いを生み出しますか?

  1. マンページやドキュメントでこれに関する情報を見つけることはできませんが、-e上記の構文#1に示すようにオプションを使用する必要があり、コマンドラインでおよび両方を使用することは重複していることが直感です-e;私は正しいですか?

編集する:より具体的に説明するために、元の質問でこれに言及する必要がありましたが、一部の人々がすでに指摘したように、これらのニュアンスはBranch(b)またはtest()コマンドを使用するtときに重要です。しかし、影響を与える他の状況に注目するのは興味深いです。ありがとうございます!

答え1

これは、いくつかのコマンドでは非常に重要です。

sedの実装では、ラベルの分岐と条件付き分岐を: foo;barそれぞれ定義します。b foo;bart foo;barfoo;bar

POSIXでも必須でした(私はそうしました。要件緩和要求)。

w foo;barすべてのコンプライアンス実装はまだr foo;barファイルに書き込むか、ファイルから読み込みます。foo;bar

#(注釈用)コマンド、、、、(追加、挿入、変更)は、明らかに同じ行で他のコマンドの後に続くことはできませんaic

履歴sed実装は他のコマンドに従うこともサポートしていません}

;POSIXではbeforeを持つことができないと言ったことがありますが、}実際にはそうする必要はありません(私もこの要件を緩和するように依頼してください)。

sed -e cmd1 -e cmd2

に該当することを意味

sed -e 'cmd1
cmd2'

しかし、実際にすべての実装が次のことを行うわけではありません。

sed -e 'a\' -e 'foo\' -e 'bar'
sed -e 's/foo/bar\' -e 'baz/g'

例えば。

答え2

使用しようSed POSIX規格質問に答えてください。

セミコロンの周りの間隔は実際の違いを生み出しますか?

{...}、a、b、c、i、r、t、w、:、および#以外の編集コマンドの後には、セミコロン、オプションの空白文字、その他の編集コマンドが続きます。

したがって、/^$/d ; $!G要件を満たしていませんが、/^$/d; $!G要件を満たしています。しかし、現代のSed実装でこの問題を見つけることができるかどうか疑問に思います。

上記の3つの構文の間に実際の違い(一般性、コンプライアンス...)がありますか?

いいえ(上記のようにセミコロンの前のスペースを除く)。これはシノプシスで非常に明確に説明されています。

sed [-n] script [file...]  
sed [-n] -e script [-e script]... [-f script_file]... [file...]

しかし、前述のように、いくつかのコマンドの後にはセミコロンは来ません。

sed -e ':a' -e 's/x/y/' -e 't a'

規制に従うと同時に

sed ':a;s/x/y;t a'

そうではありませんが、少なくともGNU Sedでは同じように機能します。

私の直感は、-eコマンドラインで(...)と(...)の両方を使用することが重複していることです。;私は正しいですか?

質問の例を参考にしてください。オプションが1つしかない場合は、その-e オプションを削除するとすべてが同じになります( -fオプションも使用しない限り(要約を参照))。しかし、

sed -e ':a' -e 's/x/y;t a'

と存在します-eが、;重複しません。

答え3

利点は編集コマンドのようです。

sed -e '/first/a This is cool' -e '/second/i also cool' < <(echo first; echo second)

生産します:

first
This is cool
also cool
second

しかし、努力中

sed -e '/first/a This is cool ; /second/i also cool' < <(echo first; echo second)

生産する

first
This is cool ; /second/i also cool
second

明らかに、セミコロンは添付の部分として解釈されます。単一のコマンドでこれを行うことはできますが、次のようになります。

sed -e '/first/a This is cool
/second/i also cool' < <(echo first; echo second)

ハードリターンを利用して新しいコマンドを起動します(スクリプトファイルを正しく実行できるようにします)。

真実:

sed '
/first/a This is cool
/second/i also cool' < <(echo first; echo second)

関連情報