Regular-Expression

如何區分文件忽略註釋(以#開頭的行)?

  • September 29, 2020

我有兩個配置文件,一個來自包管理器的原始文件,另一個是我自己修改的自定義文件。我添加了一些評論來描述行為。

如何diff在配置文件上執行,跳過註釋?註釋行定義為:

  • 可選的前導空格(製表符和空格)
  • 井號 ( #)
  • 任何其他字元

跳過第一個要求的(最簡單的)正則表達式是#.*. 我嘗試了GNU diff 3.0 的--ignore-matching-lines=RE( -I RE) 選項,但我無法讓它與那個 RE 一起工作。我也嘗試過.*#.*.*\#.*但沒有運氣。從字面上看,將 ( Port 631) 行設置為RE不匹配任何內容,將 RE 放在斜杠之間也無濟於事。

正如“diff”工具中所建議的那樣,似乎缺乏正則表達式的味道?,我試過grep -G

grep -G '#.*' file

這似乎與評論相符,但不適用於diff -I '#.*' file1 file2.

那麼,應該如何使用這個選項呢?我怎樣才能diff跳過某些行(在我的情況下,評論)?請不要建議greping 文件並比較臨時文件。

根據 Gilles 的說法,該-I選項僅在該集合內沒有其他匹配項時忽略一行,除了-I. 直到我測試它,我才完全得到它。

考試

我的測試涉及三個文件:

文件**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 shell 中工作的替代方案:

diff -u -B <(grep -vE '^\s*(#|$)' test1)  <(grep -vE '^\s*(#|$)' test2)
  • diff -u- 統一差異

    • -B- 忽略空行
  • <(command)- 一個稱為程序替換的 bash 功能,它為命令打開文件描述符,這消除了對臨時文件的需要

  • grep- 列印行(不)匹配模式的命令

    • -v- 顯示不匹配的行

    • E- 使用擴展的正則表達式

    • '^\s*(#|$)'- 匹配註釋和空行的正則表達式

      • ^- 匹配一行的開頭
      • \s*- 匹配空格(製表符和空格)(如果有)
      • (#|$)匹配雜湊標記,或者,匹配行尾

引用自:https://unix.stackexchange.com/questions/17040