ファイルに他のファイルの内容の正規表現が含まれている場合は、その行を削除してください。

ファイルに他のファイルの内容の正規表現が含まれている場合は、その行を削除してください。

DNSレコードを含む大容量ファイル(150,000行以上)がありますが、FileAと呼びます。いくつかの名前を含む小さなファイルFileBがあります。 FileAのすべての行を削除したいです。次に終わるFileBには何がありますか?しかし、私はそうですいいえ名前がレコードの先頭に表示されたら、行を削除しようとします。

grep -v name$レコードの最後に表示される名前を手動で削除する方法を知っていますが、FileB全体を通過するにはループが必要です。これまでの試みは失敗しました。

以下は、私が求めていることを示すことを望む例です。

FileA:
hosta IN A 10.20.30.40
hostb IN A 20.30.40.50
myurl IN CNAME hostb
yours IN CNAME hostb

FileB にホストが含まれている場合、最後の 2 行だけが削除され、最初の 2 行はそのまま残ります。

ベストアンサー1

この-fフラグを使用して、FileBのすべての行をgrepできます。

grep -v -f FileB FileA

それはあなたが望むものです。ただし、これによりパターンのあるFileB行も削除されます。いいえ最後にのみ一致する必要があることを明示的に指定します。したがって、それに対応する修正が必要ですFileB。 、を使用して行末記号をsed追加できます。regex$

sed 's/$/$/' FileB

これは何も置き換えないように見えますが、実際には行の$各端に1つずつ追加されます。

これで、プロセス置換を使用してこれらすべてを1つにまとめることができます。

grep -v -f <(sed 's/$/$/' FileB) FileA

おすすめ記事