如何使用这种模式:"" LEJ | * | WRO"?

时间:2015-11-17 01:44:09

标签: shell unix

我试图找到包含以下行的文件:LEJ|xxx|WRO

中间的3个字符可以忽略..

尝试

grep -l LEJ|???|WRO *

它不起作用..任何建议?

2 个答案:

答案 0 :(得分:2)

首先..你没有提到你所看到的错误(“不工作”不是错误),但我怀疑你在问题中发布的命令可能会因为垂直条而中断被解释为管道,而不是正则表达式的一部分。作为一般规则,每当您需要使用标点符号作为命令行选项时,请将其用引号括起来,最好用单引号括起来。

您帖子的主题是LEJ|*|WRO,您的文字提及LEJ|xxx|WRO。从这里我推断你想要文本“LEJ”后跟一个垂直条,然后是任意数量的其他字符或三个字符,然后是另一个垂直条,然后是“WRO”。您在问题中对此并不清楚,但您在下面的评论中澄清了这一点 - 您希望垂直条之间有三个字符。

您要传递给grep的字符串不是描述上述模式的正则表达式。首先,请注意以下正则表达式规则:

  • .(一个点)匹配任何单个字符(作为“原子”)。
  • ?(问号)是一个修饰语,表示“前一个'原子'为零或一个”。
  • *(星号)是一个修饰语,表示“前一个原子的零个或多个”。
  • |(垂直条)表示逻辑“或”,将多个表达式连接在一起。因此(one|two)将匹配“一”或“两个”。
  • [..](方括号)表示“范围”,包含一组被视为原子的字符。

要创建一个被理解为“一个或多个字符”的表达式,您可以使用,例如..*。字面意思是“任何单个字符,后跟零个或多个任何单个字符”。要表示“任意三个字符”,您需要使用...

这些角色很神奇。如果将它们包含在表达式中,则它们具有魔力属性。如果你想实际匹配其中一个,你需要ESCAPE。

现在..正则表达式有一些不同的“类型”。在Basic RE(BRE)中,or或bar本身并不神奇。在所有其他类型(包括扩展RE(ERE))中,它是。范围的一个神奇特征是它消除了其他角色的魔力,因此为了逃避垂直条,我们可以将它放在一个范围内。

所以...匹配你的字符串的正则表达式可能是:

LEJ[|]...[|]WRO

此表示法与基本(BRE)和扩展(ERE)格式兼容,因此无论您是在命令行上使用grep还是在其他语言中使用PCRE函数都无关紧要。

这个答案并非旨在成为如何使用正则表达式的详尽教程。与任何语言一样,表达事物的方式不止一种。虽然这应该可以解决您所说的问题,但它的真正目标是为您提供一些提示,帮助您更轻松地找出下一个正则表达式。

以下是一些有趣的资源:

答案 1 :(得分:0)

试试这个:egrep 'LEJ\|.{3}\|WRO'

|是正则表达式语法中的特殊字符。要搜索它,您需要在模式中使用反斜杠进行转义,如\|中所示。