次の内容を含むファイルがあります。
dn : Does not matter
uid=321 456 678
foo=/234
bar=/456
git=/543
uid=321 456 678
uid=678 987 098
foo=/234
bar=/456
git=/543
dn : Does it matter
uid=321 456 678
foo=/543
bar=/423
git=/501
uid=
予想される出力が次のように連続した項目とその後の3行を削除したいと思います。
dn : Does not matter
uid=321 456 678
foo=/234
bar=/456
git=/543
dn : Does it matter
uid=321 456 678
foo=/543
bar=/423
git=/501
2つのサーバーでこれを試しました。残念ながら、私が最も使用しているサーバーにはアクセスできません。そのため、2番目のサーバーでは、次のようなさまざまなバリエーションを試しましたが、目的の結果が得られませんでした。
sed '/^ uid=/N;{/\n uid= & & \n ^change type & & \n ^replace/d;}' pattern2.txt
awk '{/pat/?f++:f=0} f==2 {f--;}; 1' < pattern2.txt
sed '/^ uid=/N;{/\n uid=/D;}' pattern1.txt
awk '{/ uid=/?f++:f=0} f==2' pattern1.txt
ベストアンサー1
使用sed
:
$ sed -f script.sed file
dn : Does not matter
uid=321 456 678
foo=/234
bar=/456
git=/543
dn : Does it matter
uid=321 456 678
foo=/543
bar=/423
git=/501
...script.sed
どこ
H # Append a newline and the current line to the hold space
/^$/bout # Empty line: branch to ':out'
$bout # Last line: branch to ':out'
d # Delete line, start again from the top
:out
x # Swap in the data from the hold space
/uid.*uid/d # Delete the data if it contains two "uid"
s/\n// # Remove the first embedded newline
# (implicit print)
これはsed
、「予約済みスペース」(通常のバッファー)に読み込まれた行を収集し、空行または入力の終わりに遭遇すると、予約済みスペースには元のファイルの「チャンク」の1つが含まれます。これらのブロックに2つの文字列インスタンスが含まれている場合、uid
そのブロックは削除され、それ以外の場合は出力されます。