grep命令与正则表达式的范围

27 浏览
0 Comments

grep命令与正则表达式的范围

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

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

\n当我在https://www.regextester.com上使用文件内容进行测试时,结果是我所需要的,即找到了匹配的字段。但是当我尝试将其作为以下命令使用时:\n

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

\n却返回空值!这里是什么问题?

0
0 Comments

grep命令是一个强大的文本搜索工具,它可以使用正则表达式来匹配文本。默认情况下,grep使用POSIX基本正则表达式(BRE),当使用-E选项时,它会使用POSIX扩展正则表达式(ERE)。

然而,在POSIX正则表达式中,当特殊字符被转义时,其行为是不确定的,例如\s,并且没有非贪婪匹配的语法,例如+?。此外,在BRE中,+和|运算符是不可用的,括号必须被转义以进行分组。

为了解决这些问题,POSIX字符类[[:space:]]和[[:alnum:]_]可以作为\s和\w的可移植替代品。为了模拟非贪婪匹配,可以通过排除下一个匹配字符来实现,例如[^*]+?\w*:等价于[^*[:alnum:]_:]+[[:alnum:]_]*:。

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

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允许使用缩写字符类(\s和\w)和非贪婪重复(+?)作为非便携式扩展。

0
0 Comments

grep是一个常用的文本搜索工具,它可以使用正则表达式来查找匹配的文本。然而,在某些情况下,grep的范围可能会出现问题,需要使用更复杂的正则表达式来解决。

出现这个问题的原因可能是因为需要搜索的文本具有复杂的结构或模式,并且简单的grep命令无法完全满足要求。在这种情况下,需要使用更强大的工具来处理正则表达式,例如pcregrep。

pcregrep是一个支持Perl兼容正则表达式的grep工具。它可以处理更复杂的正则表达式,并提供更多的搜索功能。上述给出的命令示例中,使用了一个复杂的正则表达式来达到特定的搜索目的。

解决这个问题的方法是使用pcregrep命令,并提供适当的正则表达式来匹配所需的文本模式。在上述命令示例中,正则表达式使用了一些特殊的模式来匹配以"* [ ]"开头的行以及以".com.au"结尾的行。通过使用适当的修饰符和限定符,可以更准确地匹配所需的文本。

,当grep的范围出现问题时,可以考虑使用更复杂的正则表达式工具,例如pcregrep。通过提供适当的正则表达式,可以解决grep无法满足的复杂搜索需求。

0
0 Comments

grep命令不支持像\w和\s这样的字符类。可以尝试使用grep -E或egrep命令。其中grep -E和egrep是等价的,只是egrep更简短。

所以你的命令应该是:

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

但是,如何进行多行搜索呢?假设grep是逐行工作的,我想进行多行搜索,有解决方法吗?

这是一个不同的问题,与你在这里提出的问题不同。这个问题在这个SO问题中有所涉及:

http://stackoverflow.com/questions/152708

默认情况下,egrep也不支持\s或\w。然而,如果PCRE已经被编译进来,你可以使用--perl-regexp标志来实现。

可以参考手册:http://www.gnu.org/software/grep/manual/html_node/The-Backslash-Character-and-Special-Expressions.html#The-Backslash-Character-and-Special-Expressions

尽管公平地说,它确实表示对于grep也应该起作用。我相信在旧版本中,这是egrep的一个扩展功能。

0