Regular-Expression
如何區分文件忽略註釋(以#開頭的行)?
我有兩個配置文件,一個來自包管理器的原始文件,另一個是我自己修改的自定義文件。我添加了一些評論來描述行為。
如何
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
跳過某些行(在我的情況下,評論)?請不要建議grep
ing 文件並比較臨時文件。
根據 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*
- 匹配空格(製表符和空格)(如果有)(#|$)
匹配雜湊標記,或者,匹配行尾