7

我正在尝试将正则表达式与 Linux 的 grep 命令一起使用

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

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

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

它给我的只是一个空值!

这里有什么问题?

4

3 回答 3

3

我不认为理解像and之grep类的字符类。尝试使用或。(相当于,只是更短的类型。)\w\sgrep -Eegrepgrep -Eegrepegrep

所以你的命令是:

egrep '(^\s*\*\s*\[ \][^\*]+?(\w*\:[^\*]+\d$)|([^\*]+[.]com[.]au$))' file1
于 2012-06-13T11:41:50.640 回答
2
pcregrep -M  '(^\s*\*\s*\[ \][^\*]+?(\w*\:[^\*]+\d$)|([^\*]+[.]com[.]au$))'

成功了:)

于 2012-06-13T18:37:21.283 回答
0

grep(1)默认情况下使用POSIX 基本正则表达式,与 选项一起使用时使用POSIX 扩展正则表达式。-E

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

POSIX 字符类 [[: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

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

于 2017-02-27T23:11:52.907 回答