Solaris 10でパターンを一致させ、パターンを削除し、次の行と前の行を削除する方法は? SolarisにはGNU sedが付属していないため、難関に遭遇しました。次のファイルの内容を考えると:
LinearFile(3F007F106F3B, FDN, 29, 20)
LinearFile(3F007F106F40, XXX, 29, 1)
{
LinearRec(1, 12345)
}
LinearFile(3F007F106F3C, SMS, 176, 20)
LinearFile(3F007F106F4F, ECCP, 15, 10)
LinearFile(3F007F106F40, XXX, 29, 1)
{
LinearRec(1, FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)
}
LinearFile(3F007F106F42, SMSP, 43, 3)
BinaryFile(3F007F106F43, SMSS, 2)
LinearRec(1, 12345)
以下を含むブロックを削除したいと思います。
{
LinearRec(1, FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)
}
ファイルは次のとおりです。
LinearFile(3F007F106F3B, FDN, 29, 20)
LinearFile(3F007F106F40, XXX, 29, 1)
{
LinearRec(1, 12345)
}
LinearFile(3F007F106F3C, SMS, 176, 20)
LinearFile(3F007F106F4F, ECCP, 15, 10)
LinearFile(3F007F106F40, XXX, 29, 1)
LinearFile(3F007F106F42, SMSP, 43, 3)
BinaryFile(3F007F106F43, SMSS, 2)
LinearRec(1, 12345)
次の行を削除するために、次のコマンドを実行しました。
sed -e '/LinearRec(1\,\ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)/{n;d;}' file.txt
一致する行と前の行はどうですか?
たぶんedやviを使って達成できますか?ありがとうございます!
答え1
以下はスクリプトですed
。
ed <<\!
e file.txt
/LinearRec(1, FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)
-1,+1d
w newfile.txt
!
出力をファイルに書き込みますnewfile.txt
。
「グローバル」レプリケーションのバージョンは次のとおりです。
ed <<\!
e file.txt
g/LinearRec(1, FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)/-1,+1d
w newfile.txt
!
答え2
1つのperl
アプローチ(ファイルがメモリにロードされるのと同じくらい小さいと仮定):
perl -0pe 's/.+?\n.*?LinearRec\(1, F{58}\).*?\n.*?\n//' file
フルファイルを-0
フルルックにし、与えられたスクリプトを適用した後に各入力行を印刷するように指示します。スクリプト自体は、58行とその2行を一致させて削除します。perl
-p
-e
F
答え3
sed -ne'$p;N;/^ *{ *\n *LinearRec(1, *FF*) *$/n;/\n/P;D' <in >out
sed
シングルラインプレビューを行い、シリーズにP
合わないラインを出力します。最初の2行と一致すると、再びジャンプしてバッファをダンプするためです。