コメント(#で始まる行)を無視してファイルを区別する方法は?

コメント(#で始まる行)を無視してファイルを区別する方法は?

2つの設定ファイルがあります。 1つはパッケージマネージャのソース設定ファイル、もう1つは私が直接変更したカスタム設定ファイルです。動作を説明するためにいくつかの説明を追加しました。

diff設定ファイルをスキップするコメントを実行するには?コメント行は次のように定義されます。

  • オプションの先行スペース(タブとスペース)
  • ハッシュタグ( #)
  • その他の文字

最初の要件をスキップする(最も簡単な)正規表現はです。 GNU diff 3.0の()オプションを#.*試しましたが、対応するREでは機能しませんでした。私も試してみましたが、運がありませんでした。文字通り、行( )を何も一致しないものとして置き、スラッシュの間にREを入れることも役に立ちません。--ignore-matching-lines=RE-I RE.*#.*.*\#.*Port 631RE

提案通り「diff」ツールの正規表現スタイルが足りないと思いますか?、私は次のことを試しましたgrep -G

grep -G '#.*' file

これはコメントと一致するようですが、うまくいきませんdiff -I '#.*' file1 file2

それでは、このオプションをどのように使用する必要がありますか?diff特定の行(私の場合はコメント)をスキップするにはどうすればよいですか?grepファイルを確認し、一時ファイルを比較することを提案しないでください。

ベストアンサー1

Gillesによると、-Iこのオプションはセットからを除いて一致するものがない場合にのみ行を無視します-I。テストするまでは完全に理解していませんでした。

テストを受ける

私のテストには3つのファイルが含まれています
test1:

    text

文書test2:

    text
    #comment

文書test3:

    changed text
    #comment

注文する:

$ # comparing files with comment-only changes
$ diff -u -I '#.*' test{1,2}
$ # comparing files with both comment and regular changes
$ diff -u -I '#.*' test{2,3}
--- test2       2011-07-20 16:38:59.717701430 +0200
+++ test3       2011-07-20 16:39:10.187701435 +0200
@@ -1,2 +1,2 @@
-text
+changed text
 #comment

別の方法

これまで、-Iこのオプションを正しく使用する方法に対する答えがないので、bashシェルで動作する代替手段を提供します。

diff -u -B <(grep -vE '^\s*(#|$)' test1)  <(grep -vE '^\s*(#|$)' test2)
  • diff -u- 違いを統合する
    • -B- 空行を無視してください
  • <(command)- bash 関数の呼び出しプロセスの交換コマンドのファイル記述子を開いて一時ファイルは必要ありません。
  • grep- パターンと一致しない行を印刷するコマンド
    • -v- 一致しない行の表示
    • E- 拡張正規表現を使用してください。
    • '^\s*(#|$)'- コメントと空白行を一致させる正規表現
      • ^- 行の先頭に一致します。
      • \s*- スペース(タブとスペース)がある場合は一致します。
      • (#|$)ハッシュタグまたは行末と一致します。

おすすめ記事