私があちこちで叫んでいるかもしれませんが、私を悩ませていたこの質問が一度に答えを得てほしいです...
以下を表すテキストファイル:
Line one.
Line two.
Line three.
Line four.
sed
このテキストファイルに空行を一貫して追加するには、1行につき2つのコマンドが必要です。これは、次の構文のいずれかを使用して達成できます。
sed -e '/^$/d' -e '$!G' <file>
...しかしそうではありません(sed -e '/^$/d' '$!G' <file>
またはsed '/^$/d' '$!G' <file>
)sed -e '/^$/d; $!G' <file>
またはsed -e '/^$/d ; $!G' <file>
sed '/^$/d; $!G' <file>
またはsed '/^$/d ; $!G' <file>
私の質問は次のとおりです
- 上記の5つの作業構文の間に実際の違い(一般性、コンプライアンスか...)がありますか?
- リチャード・ブルームの最新作コマンドラインとシェルスクリプト聖書
sed -e 's/brown/red/; s/dog/cat/' data1.txt
次のアドバイスをする前に、このようなものを使用するように言います。
コマンドはセミコロン(;)で区切る必要があり、最初のコマンドの終わりとセミコロンの間にはスペースを入れないでください。
-e
...その後、オプションをまったく使用せずにコマンドの終わりとセミコロンの間にスペースを追加するなど、自分のアドバイスを完全に無視します(上記の#3の2番目のバリエーションのように)。セミコロンの周りの間隔は実際の違いを生み出しますか??
- マンページやドキュメントでこれに関する情報を見つけることはできませんが、
-e
上記の構文#1に示すようにオプションを使用する必要があり、コマンドラインでおよび両方を使用することは重複していることが直感です-e
。;
私は正しいですか?
編集する:より具体的に説明するために、元の質問でこれに言及する必要がありましたが、一部の人々がすでに指摘したように、これらのニュアンスはBranch(b
)またはtest()コマンドを使用するt
ときに重要です。しかし、影響を与える他の状況に注目するのは興味深いです。ありがとうございます!
ベストアンサー1
これは、いくつかのコマンドでは非常に重要です。
元sed
の実装では、ラベルの分岐と条件付き分岐を: foo;bar
それぞれ定義します。b foo;bar
t foo;bar
foo;bar
POSIXでも必須でした(私はそうしました。要件緩和要求)。
w foo;bar
すべてのコンプライアンス実装はまだr foo;bar
ファイルに書き込むか、ファイルから読み込みます。foo;bar
#
(注釈用)コマンド、、、、(追加、挿入、変更)は、明らかに同じ行で他のコマンドの後に続くことはできませんa
。i
c
履歴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'
例えば。