クエリが見つかったテキストブロック(テキスト)を削除するbashスクリプトを作成しようとしています。残念ながら私はそれを動作させることはできません。
次のリストファイルがあります。
[valid_account]
user = doe.john
passw = 4567
mac = 11-22-33-44-bb-cc
s2 = qwe
[valid_account]
user = kent.clark
passw = 1234
mac = 00-11-22-33-aa-bb
s1 = abc
s2 = efg
[valid_account]
user = bond.james
passw = 6789
mac = 44-55-66-77-ee-ff
s4 = bnm
[valid_account]
user = parker.peter
passw = 9876
mac = 77-bb-cc-66-00-aa
s1 = abc
クエリが00-11-22-33-aa-bbの場合、そのクエリに続くテキストブロックをどのように削除できますか?
[valid_account]
user = doe.john
passw = 4567
mac = 11-22-33-44-bb-cc
s2 = qwe
[valid_account]
user = bond.james
passw = 6789
mac = 44-55-66-77-ee-ff
s4 = bnm
[valid_account]
user = parker.peter
passw = 9876
mac = 77-bb-cc-66-00-aa
s1 = abc
答え1
GNU sedの使用
sed '/valid_account/!d;:A;N;$bB;/\n$/!bA;:B;/00-11-22-33-aa-bb/d' infile
答え2
awk -v delete_regex='00-11-22-33-aa-bb' -v RS=$'\n\n' -v ORS=$'\n\n' \
'$0 !~ delete_regex' inputfile
検索文字列が正規表現として解釈されないように変更できます。
答え3
そして真珠、簡潔で簡潔な方法:
$ perl -00ne 'print if !/00-11-22-33-aa-bb/' file
または変数を使用してくださいstr
。
str='00-11-22-33-aa-bb' perl -00lne 'print if !/$ENV{"str"}/' file
出力:
[valid_account]
user = doe.john
passw = 4567
mac = 11-22-33-44-bb-cc
s2 = qwe
[valid_account]
user = bond.james
passw = 6789
mac = 44-55-66-77-ee-ff
s4 = bnm
[valid_account]
user = parker.peter
passw = 9876
mac = 77-bb-cc-66-00-aa
s1 = abc