使用 grep 命令查询 unix 的正则表达式

使用 grep 命令查询 unix 的正则表达式

你好,

我无法理解 Unix 终端下正则表达式中句点 (.) 运算符的完整功能。

它说它匹配任何单个字符。当我给grep ‘ct’ a.txt,它返回诸如 cat、cbt、cmt 等结果。它是否也应该打印任何其他类型的数据?因为我不清楚这个周期运算符的基础知识。

如果我给grep ‘c[abm].t’ a.txt,它没有给出预期的结果,即我认为它应该只打印 cat 或 cbt 或 cmt,但它只打印 caat,这是数据之一。请澄清。

此外,如果有任何教程可以帮助我掌握正则表达式的技能,请分享。非常感谢。请尝试解决我的问题。

谢谢。

答案1

句点运算符匹配任意字符一次,且仅匹配一次。因此,在第一个示例中,它匹配 ac 后跟一个字符,该字符后跟一个 t。

在第二个示例中,您的模式被要求匹配 4 个字符,且恰好 4 个字符。它们是:

C

其次是

[abm] - 以下任何一个

其次是

. - 任意单个字符

其次是

至于学习正则表达式,请查看此处:https://stackoverflow.com/questions/4736/learning-regular-expressions

答案2

在您的示例中,grep 'c[abm].t' a.txt 将输出 a.txt 中包含至少四个您指定的字符的任何行。'c'、'a'、'b' 或 'm'、'任何字符',然后是 't'。

'c[abm].t' 将匹配:

cart
caat
ca%t
caNt
cm_t
moo cbqt this whole line is returned because it contains a match
rocbtt

等等等等。

希望这有助于您理解您的示例。

正则表达式可能非常复杂。除了我现在第一次发现和查看的内容之外,我无法随意推荐任何其他内容。

请注意,有许多不同的风格和实现,从 grep(和 egrep / grep -E)到 perl 到 php 到 Javascript 等等。

在玩这些工具时,你会发现自己必须记住正确地从 shell 中转义某些内容,并从正则表达式本身中删除其他内容……如果要匹配文字“.”(句点),则需要使用 grep 来'moo\.'匹配“moo.”而不是“moof”

O'Reilly 出版的《精通正则表达式》一书被认为相当权威。

答案3

句点运算符可匹配任何字符,正如描述中所述。因此,“ct”将匹配“cat”、“cbt”、“cct”...“czt”、“c1t”...等。

在您的第二个示例中,结果正如预期的那样。[abm] 匹配任何字符 a、b 或 m。紧接着,句点运算符匹配任何字符。因此,该表达式仅查找四个字母的字符串。

我发现学习正则表达式的最佳资源是掌握正则表达式来自 O'Reilly Media。它不仅涵盖了大量的正则表达式方言,而且还深入介绍了引擎如何进行实际处理。如果您要定期使用正则表达式(双关语),那么这是一个非常宝贵的资源。

答案4

如果你没有时间读完整本关于这个主题的书,那么尝试一下特浓咖啡(.net 语法)或商业工具正则表达式好友可以执行 perl、ruby、java、.net 和 grep 语法(以及其他语法)。这两个工具都可以让您测试哪些匹配哪些不匹配,并向您显示正则表达式含义的树。

对于您的问题,您预期的行为不会来自,c[abm]t但这c[abm].t已经被指出了。

相关内容