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
アプローチperl
(ファイルがメモリにロードできるほど小さいと仮定):
perl -0pe 's/.+?\n.*?LinearRec\(1, F{58}\).*?\n.*?\n//' file
はファイル全体を slurp-0
しperl
、-p
は によって指定されたスクリプトを適用した後、各入力行を印刷するように指示します-e
。スクリプト自体は 58F
と周囲の 2 行を一致させて削除します。
答え3
sed -ne'$p;N;/^ *{ *\n *LinearRec(1, *FF*) *$/n;/\n/P;D' <in >out
これにより、sed
1 行先を先読みし、P
シリーズに適合しない行のみを出力します。これは、最初の 2 行に一致すると、さらに 1 行ジャンプしてバッファーをダンプするためです。