#Linuxで文字列から文字列までを改行を含めて削除(置換)するコマンド
以下のコマンドでhoge.txtの文字列から文字列まで削除します。途中に改行があっても削除できます。
sed ':lbl1;N;s/ここから削除.*ここまで削除//;b lbl1;' hoge.txt
ここまで削除と記載さている行全体まで削除したい場合は以下のコマンド
sed ':lbl1;N;s/ここから削除.*ここまで削除.*\n//;b lbl1;' hoge.txt
文字列から文字列までを改行を含めて置換する場合は以下のコマンド
//内に置換後の文字列をセットします。
sed ':lbl1;N;s/ここから置換.*ここまで置換/置換後の文字列/;b lbl1;' hoge.txt
これを使えば膨大なログファイルでも、不要な個所をバッサリ削除できます。
マッチする箇所が複数ある場合は全て削除されます。
##使用例
[user@host ~]$ cat hoge.txt
ここは残す
あああああ
aaaaaaaaaa
bbbbbbbbbb
1234567890
ここまで残す
ここから削除
かかかかか
cccccccc
dddddddddd
1234567890
ここまで削除
ここは残す
さささささ
eeeeeeeeee
ffffffffff
1234567890
ここまで残す
ここから削除
たたたたた
gggggggggg
hhhhhhhhhh
1234567890
ここまで削除
ここは残す
[user@host ~]$ sed ':lbl1;N;s/ここから削除.*ここまで削除.*\n//;b lbl1;' hoge.txt
ここは残す
あああああ
aaaaaaaaaa
bbbbbbbbbb
1234567890
ここまで残す
ここは残す
さささささ
eeeeeeeeee
ffffffffff
1234567890
ここまで残す
ここは残す
##解説 sed で改行を含む文字列の置換・削除
sed は入力を1行ずつ読み込む為、sedの正規表現はそのままでは改行を含む文字列をマッチできません。
そこでNコマンドN;
を使用します。Nコマンドを使用すると次の1行も読み込んでくれます。
これで改行をマッチさせることができます。
さらに、lbl1;
からb lbl1;
はbコマンドまで来ると先頭にジャンプします。
よって、Nコマンドを繰り返して全行読み込みます。これで複数の改行にまたがる箇所も削除できます。
全行読み込む為、巨大なファイルの場合は処理に時間がかかります。
削除する箇所の最大の行数が分かっているなら、その数だけNコマンドを実行した方が速くなると思います。
ちなみに正規表現のピリオドは改行を含まない任意の1文字ですが、この場合のピリオドは改行も含む挙動をしました。気づかないとハマります。
sedの正規表現、特にNコマンドを使用した場合は、正規表現の挙動を疑いながらテストするべしです。