2

我正在尝试编写一个正则表达式来从 /etc/samba/smb.conf中提取所有非注释非空行。注释是这样的行:

  1. 从...开始 #
  2. 从...开始 ;
  3. 以任意数量的空格开头,紧跟 # 或 ;

我尝试了以下方法,但它没有正确处理评论类型 3。

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

这个适用于所有 3 种类型的评论:

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

您能解释一下为什么在字符类中添加 \s 会成功过滤掉注释类型 3 吗?

4

2 回答 2

1

[^...]表示与 . 的位置给出的任何字符都不匹配...

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

于 2015-05-13T18:40:44.993 回答
1

这里的问题是部分匹配,因为您没有使用 end anchor $

在示例 3 的情况下

      ;

将进行部分匹配。在您禁用的另一个正则表达式中;,它不会捕获空间并且部分匹配被禁用。\s*\s

这里正确的正则表达式是

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

看演示

于 2015-05-13T18:53:46.470 回答