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が指定されているように(アドレスまたは代替コマンドの一部として)動作する必要があります。