ファイルから特定のパターンに一致するテキストを削除する方法

ファイルから特定のパターンに一致するテキストを削除する方法

2つのファイル(fileAとfileB)の違いを確認するために比較したいと思います。 fileAはテンプレートファイルと同じで、fileBは比較したいファイルです。違いを見つけるたびに、その違いをfileCに出力したいと思います。

難しいのは、fileAとfileBには、一部のデータ(時間、日付、およびランダムに生成されたIDコード)が常に他の一部(すべてではない)行が含まれていることです。しかし、唯一の違いは、時間、日付、およびIDコードだけのfileCに行を出力したくないことです。

だから私が望むのは、fileBに表示されるすべての行から時間、日付、およびIDコードを削除してから(fileAで手動でこれを実行できます)、fileBと比較して別の行をfileCに出力することです。

削除するテキストは常に特定のパターンに従うことに注意してください。だからgrepとこれらのパターンを使用してテキストを見つけることができますが、削除する方法がわかりません...

以下は、私が意味するものを説明する2つのファイルの例です。

  • 文書B

    qaqa rara
    abc 10:12:25 08/20/2014 123456 def
    ghi fff ddd
    jkl 09:20:40 08/20/2014 978645 dfdf gggg
    
  • ファイルA

    qaqa rara
    abc 10:32:15 07/15/2014 121456 xxx
    ghi eee ddd
    jkl 10:01:22 07/15/2014 971645 dfdf gggg
    

時間(例:10:12:25)、日付(例:08/20/2014)、またはIDコード(例:123456)を無視して、上の2つのファイルの違いを見つけて、違いをfileCに出力したいと思います。

2行が異なるため、2行と3行になります。両方のファイルの行1は同じです。時刻、日付、ID情報を削除すると、2つのファイルの4行目は同じです。

ベストアンサー1

タイムスタンプが一貫した形式の場合は、diffメソッド(sedなど)を使用して、ファイルを処理する前にそれらを削除できます。

diff <(sed -E 's|[0-9]{2}:[0-9]{2}:[0-9]{2} [0-9]{2}/[0-9]{2}/[0-9]{2,4} [0-9]{1,} ||' fileA) <(sed -E 's|[0-9]{2}:[0-9]{2}:[0-9]{2} [0-9]{2}/[0-9]{2}/[0-9]{2,4} [0-9]{1,} ||' fileB)

指定した入力ファイルをテストします。

$ diff \
<(sed -E 's|[0-9]{2}:[0-9]{2}:[0-9]{2} [0-9]{2}/[0-9]{2}/[0-9]{2,4} [0-9]{1,} ||' fileA) \
<(sed -E 's|[0-9]{2}:[0-9]{2}:[0-9]{2} [0-9]{2}/[0-9]{2}/[0-9]{2,4} [0-9]{1,} ||' fileB)
2,3c2,3
< abc xxx
< ghi eee ddd
---
> abc def
> ghi fff ddd

おすすめ記事