コマンド sed -e 's/\(~\).*\(~\)// はテキスト ファイルに何を実行しますか?

コマンド sed -e 's/\(~\).*\(~\)// はテキスト ファイルに何を実行しますか?

コマンドはテキスト ファイルに何 sed -e 's/\(~\).*\(~\)// を行うのでしょうか? 理解できません。仕事中に遭遇しました。

答え1

コマンドは(最後に欠落している一重引用符を追加した場合)、ファイルのすべての行を端末に出力しますが、いずれかの行に少なくとも 2 つの(チルダ)文字がある場合は、内の置換コマンド( )によって~最初と最後の間のビットが削除されます。~ssed

例:

$ cat file
1 2 3 ~ 4
1~2~3
Here is ~ the last ~ line ~ THE END
$ sed -e 's/\(~\).*\(~\)//' file
1 2 3 ~ 4
13
Here is  THE END

ただし、と\(\)必要ありません(式では後方参照が使用されていないため)。また、 も-e省略できます(式が1つしかないため)。したがって、このコマンドは次のコードと同等です。

sed 's/~.*~//' file

だから、するファイル自体には何も変更されませんが、ファイルの内容を読み取って変更し、処理されたテキストを生成します。このテキストは、リダイレクト ( sed ... >newfile) を使用して新しいファイルに保存できます。


後方参照できたこのコマンドでは次のように使用します。

sed 's/\(~\).*\1//' file

つまり、 に一致し~、次に他のテキストに一致し、最後に最初のグループで一致したもの\(...\)(チルダ) に一致します。ただし、これによって入力が節約されたり、コマンドの保守や理解が容易になったりするわけではないため、 の改善にはなりませんsed 's/~.*~//' file

関連情報