2015-05-13 147 views
2

我想寫一個正則表達式來從/etc/samba/smb.conf中取出所有非註釋非空行。正在評論線說:PCRE正則表達式空格

  1. 下手#
  2. 下手;
  3. 以任何數量的空白開頭,緊接着是#或;

我嘗試以下,但它並不能正確處理意見類型3

grep -P '^\s*[^#;]' /etc/samba/smb.conf 

所有3種類型的評論這一個工作:

grep -P '^\s*[^#;\s]' /etc/samba/smb.conf 

你能解釋爲什麼增加\ s到角色類成功過濾掉了評論類型3?

+0

@vks沒有它不應該,這一個工程'貓的smb.conf | grep的-P '\ S * [#]' - v'。在模式開始和字符組定義裏面閱讀關於'^'的內容 – Reishin

回答

1

這裏的問題是partial matches,因爲您還沒有使用末端固定器$

在示例的情況下,3

 ; 

將有高達;通過\s*完成。在其他的regex您已經禁用\s所以它不會捕捉空間和部分匹配禁用部分匹配。

這裏的正確的正則表達式是

(?m)^(?!\s*[#;]).+$ 

See demo

+0

這是錯誤的,在我的文件上測試而不是像'#fsdfs'這樣的過濾行(空格開頭) – Reishin

+0

我告訴你實際的命令輸出結果,他們沒有做到OP期望的結果。 – Reishin

+0

這個答案仍然匹配以空格和#開頭的行。 – nhavens

1

[^...]表示與...處的任何字符不匹配。

您需要:^\s*[#;]

+0

這是不正確的。仔細閱讀問題。 '從/ etc/samba/smb.conf中取出所有非註釋行.''在grep,'^'不需要的情況下爲 – vks

+0

,'cat smb.conf | grep -P'\ s * [#;]'-v '。 OP問題提出的答案提供了錯誤的結果 – Reishin

+0

和PS'^'在字符串開頭 - 意味着行首,閱讀關於'^ ... $'。所以回答是完全錯誤的 – Reishin