sed s///(空のパターンと置換)が特定の文字列を削除するのはなぜですか?

sed s///(空のパターンと置換)が特定の文字列を削除するのはなぜですか?

Junk.txtとLines.txtという2つのファイルがあります。

$>cat junk.txt
This is a junk text
$>cat lines.txt
Line1
Line2
Line3
Line4

sed次のスクリプトを実行すると

 sed -i -e  "/Line3/r junk.txt" -e "s///" lines.txt

私は次のような結果を得ます。

Line1
Line2

This is a junk text
Line4

ご覧のとおり、Line3もう存在しません。さて、この/Line3/r junk.txt部分はline.txtでLine3と一致するテキストを見つけてjunk.txtの内容を追加します。しかし、なぜs///このコマンドは一致する行を完全に削除するのですか?

正直なところ、これが私に必要な行動ですが、なぜこれが起こるのか知りたいのです。

答え1

s空の正規表現で編集コマンドを呼び出すと、最近使用した式が再利用されます。この場合、Line3以前の一致を再利用します。これは//(空の正規表現)コマンドとアドレス範囲で機能します。s

この機能がない場合は、次のようにコマンドを作成することもできます。

sed -i -e '/Line3/r junk.txt' -e 's/Line3//' lines.txt

テキストLine3が置き換えられていないため削除されました。

時々このような構造を見ることができます。

/expression/ {
    s//replacement/
    # other code here
}

これPOSIX仕様sedで表現する

REが空の場合(つまり、モードが指定されていない場合)、sedは、最後に適用されたコマンドで使用された最後のREが指定されているように(アドレスまたは代替コマンドの一部として)動作する必要があります。

関連情報