8

ファイル内の特定の変更を無視して、2 つのファイルを比較する必要があることがよくあります。行全体を無視するのではなく、一部だけを無視します。これの最も一般的なケースは行のタイムスタンプですが、無視する必要がある他のパターンも数十あります。

ファイル1:

[2012-01-02] Some random text foo
[2012-01-02] More output here

ファイル 2:

[1999-01-01] Some random text bar
[1999-01-01] More output here

この例では、行番号 1 の違いを確認したいのですが、行番号 2 の違いは確認したくありません。

diff の -I オプションを使用しても、行全体が無視されるため機能しません。理想的な出力:

--- file1       2013-04-05 13:39:46.000000000 -0500
+++ file2       2013-04-05 13:39:56.000000000 -0500
@@ -1,2 +1,2 @@
-[2012-01-02] Some random text foo
+[1999-01-01] Some random text bar
 [2012-01-02] More output here

これらのファイルを sed で前処理できます。

sed -e's/^\[....-..-..\]//' < file1 > file1.tmp
sed -e's/^\[....-..-..\]//' < file2 > file2.tmp
diff -u file1.tmp file2.tmp

しかし、それらの一時ファイルをどこかに置く必要があり、後でそれらをクリーンアップすることを忘れないでください. また、私の差分出力は元のファイル名を参照しなくなり、元の行を出力しなくなりました。

これを単一のコマンドとして実行できる、広く利用可能な diff の変種、または同様のツールはありますか?

4

2 に答える 2

2

一時ストリームを使用して、ファイルの作成とクリーンアップを回避できます。構文は次のとおりです。

$ diff <(command with output) <(other command with output)

あなたの場合:

diff <(cat f1 | sed -e's/^\[....-..-..\]//') <(cat f2 | sed -e's/^\[....-..-..\]//')

お役に立てれば。

于 2013-04-05T19:01:56.347 に答える