我正在尝试使用Linux的grep命令的正则expression式
(^\s*\*\s*\[ \][^\*]+?(\w*\:[^\*]+\d$)|([^\*]+[.]com[.]au$))
当我在https://www.regextester.com用一个文件的内容尝试它时,我得到了所需的结果,即所需的字段得到匹配,但是当我试图使用它作为
grep '(^\s*\*\s*\[ \][^\*]+?(\w*\:[^\*]+\d$)|([^\*]+[.]com[.]au$))' file1
它给我的是一个空!
这里有什么问题?
我不认为grep
理解像\w
和\s
这样的字符类。 尝试使用grep -E
或egrep
。 ( grep -E
相当于egrep
, egrep
只是输入较短)。
所以你的命令是:
egrep '(^\s*\*\s*\[ \][^\*]+?(\w*\:[^\*]+\d$)|([^\*]+[.]com[.]au$))' file1
pcregrep -M '(^\s*\*\s*\[ \][^\*]+?(\w*\:[^\*]+\d$)|([^\*]+[.]com[.]au$))'
做了诀窍:)
grep(1)
默认情况下使用POSIX Basic正则表达式 ,使用-E
选项时使用POSIX Extended正则表达式 。
在POSIX正则表达式中,非特殊字符在转义时具有未定义的行为,例如。 \s
,没有非贪心匹配的语法,例如。 +?
。 而且,在BRE中, +
和|
运算符不可用,而括号必须转义才能执行分组。
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
请注意, grep(1)
的GNU实现允许短字符类( \s
和\w
)和非贪婪重复( +?
)作为非可移植扩展。