【问题标题】:Scope of grep with regular expressions带有正则表达式的 grep 范围
【发布时间】:2012-06-16 08:39:31
【问题描述】:

我正在尝试在 Linux 的 grep 命令中使用正则表达式

(^\s*\*\s*\[ \][^\*]+?(\w*\:[^\*]+\d$)|([^\*]+[.]com[.]au$))

当我在 https://www.regextester.com 尝试使用文件内容时,我得到了所需的结果,即,所需的字段正在匹配,但当我尝试将其用作

grep '(^\s*\*\s*\[ \][^\*]+?(\w*\:[^\*]+\d$)|([^\*]+[.]com[.]au$))' file1

它给我的只是一个空值!

这里有什么问题?

【问题讨论】:

    标签: regex linux grep


    【解决方案1】:

    我不认为grep 理解像\w 和\s 这样的字符类。尝试使用grep -E 或egrep。 (grep -E 等价于 egrep,egrep 只是更短的类型。)

    所以你的命令是:

    egrep '(^\s*\*\s*\[ \][^\*]+?(\w*\:[^\*]+\d$)|([^\*]+[.]com[.]au$))' file1
    

    【讨论】:

    • 这很酷,但我如何进行多行搜索?假设 grep 逐行工作..我想要多行搜索..那么有什么解决方案吗?
    • @KiranVemuri 这是你在这里提出的另一个问题。 this SO question 涵盖了该主题
    • 默认情况下,egrep 也不理解 \s 或 \w。但是,如果已编译 PCRE,则可以使用 --perl-regexp 标志。
    • 虽然,公平地说,它确实说它也应该适用于grep。我很确定在旧版本中这是一个 egrep 扩展。
    【解决方案2】:
    pcregrep -M  '(^\s*\*\s*\[ \][^\*]+?(\w*\:[^\*]+\d$)|([^\*]+[.]com[.]au$))'
    

    成功了 :)

    【讨论】:

      【解决方案3】:

      grep(1) 默认使用POSIX Basic Regular Expressions,POSIX Extended Regular Expressions 与-E 一起使用 选项。

      在POSIX Regular Expressions 中,非特殊字符在转义时具有未定义的行为,例如。 \s,并且没有非贪婪匹配的语法,例如。 +?。此外,在 BRE 中,+ 和 | 运算符不可用,必须对括号进行转义才能执行分组。

      POSIX character classes [[:space:]] 和 [[:alnum:]_] 分别是 \s 和 \w 的便携式替代品。

      从重复中排除下一个匹配字符可用于模拟非贪婪匹配,例如。 [^*]+?\w*: 等价 到[^*[:alnum:]_:]+[[:alnum:]_]*:。

      给定的正则表达式可以表示为多个 BRE:

      grep -e '^[[:space:]]*\*[[:space:]]\{1,\}\[ \][^*[:alnum:]_+]\{1,\}[[:alnum:]_]*:[^*]\{1,\}[[:digit:]]$' \
          -e '[^*]\{1,\}\.com\.au$' file1
      

      或 ERE:

      grep -E '^[[:space:]]*\*[[:space:]]*\[ \][^*[:alnum:]_:]+[[:alnum:]_]*:[^*]+[[:digit:]]$|[^*]+\.com\.au$' \
          file1
      

      请注意,grep(1) 的 GNU 实现允许将短字符类(\s 和 \w)和非贪婪重复(+?)作为不可移植的扩展。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多