Webを検索した後、Lekensteynの別の方法が私が見つけたより良い方法です。
ただし、dif出力をパッチとして使用する必要があります。また、「grep -v」により行番号が保持されるため、問題があります。
だから私はこのコマンドラインを改善することを目的としています:
diff -u -B <(sed 's/^[[:blank:]]*#.*$/ /' file1) <(sed 's/^[[:blank:]]*#.*$/ /' file2)
完全ではありませんが、行番号はパッチファイルに保持されます。
ただし、コメント行の代わりに新しい行が追加された場合、以下のようにパッチを適用すると、コメントはハンク失敗を生成します。
File test1:
text
#comment
other text
File test2:
text
new line here
#comment changed
other text changed
今すぐコマンドをテストしてください
$ echo -e "#!/usr/bin/sed -f\ns/^[[:blank:]]*#.*$/ /" > outcom.sed
$ echo "diff -u -B <(./outcom.sed \$1) <(./outcom.sed \$2)" > mydiff.sh
$ chmod +x mydiff.sh outcom.sed
$ ./mydiff.sh file1 file2 > file.dif
$ cat file.dif
--- /dev/fd/63 2014-08-23 10:05:08.000000000 +0200
+++ /dev/fd/62 2014-08-23 10:05:08.000000000 +0200
@@ -1,2 +1,3 @@
text
+new line
-other text
+other text changed
/ dev / fd / 62および/ dev / fd / 63は、プロセス置換によって生成されたファイルです。「+ new line」と「-other text」の間の行は、コメントを置き換えるためにsed式で定義されたデフォルトのスペース文字です。
そして今、私たちがこのパッチを適用するとき、何が来るのか:
$ patch -p0 file1 < file.dif
patching file file1
Hunk #1 FAILED at 1.
1 out of 1 hunk FAILED -- saving rejects to file file1.rej
解決策は、-uなしで統合diff形式を使用しないことです。
$ echo "diff -B <(./outcom.sed \$1) <(./outcom.sed \$2)" > mydiff.sh
$ ./mydiff.sh file1 file2 > file.dif
$ cat file.dif
1a2
> new line
3c4
< other text
---
> other text changed
$ patch -p0 file1 < file.dif
patching file file1
$ cat file1
text
new line
#comment
other text changed
現在、パッチファイルの作業ファイル(非常に複雑なdiffプロセスの結果の保証なし)。
-I
オプションは、すべての行が正規表現に一致する場合にのみブロックを無視します。そのため、コメントのみの変更は無視できますが、コメント以外の変更に近いコメントの変更は無視できません。