我的问题来源是这个链接的答案,加上一些额外的东西
grep \\[[a-z\|1-9]*\\] file,但不理解第二个命令的输出,即grep \[[a-z\|1-9]*\] file.现在,我只想了解第二个命令的输出是如何构造的,特别是为什么grep完全选择了整个第三行和第四行,而只选择了第二行和第三行,直到第一个]。

发布于 2017-07-10 18:49:24
这里有太多的变量和未声明的假设,无法详尽地回答你的问题。
这里的主要陷阱是,defaut的外壳(即大多数与Bourne兼容的shell --实际上不确定zsh或csh和导数)将通过未扩展的glob,如果它与任何东西不匹配。因此,像\\[[a-z0-9]*\\]这样的表达式首先尝试作为通配符。如果没有匹配的文件(如\fno[rd\],其中的非字母都是文字的),则通配符将逐字传递给grep。
(让我们再检查一遍。这是一个双反斜杠,即引文反斜杠,后面是两个开头方括号。第一个创建一个字符类,其第一个字符是第二个文字[。将此解析为正则表达式的结果不同,但类似地复杂。)
对此唯一合理的解决方案是正确引用不需要由shell进行空格标记化和通配符扩展的任何内容。我的建议是在所有正则表达式周围使用单引号。然后,您将能够形成一个合理的预期,什么将匹配和如何,没有两个专家解释(一个外壳,一个正则表达式)您的模式。
如果您想要与var[1]完全匹配,那么像[a-z]*\[[0-9]*\]这样的正则表达式就会这样做。如果希望方括号成为字符类的一部分,请尝试[][a-z0-9]*,其中第一个]和第二个[是字符类的文字成员。如果你把单引号传递给shell中的grep,记住它们周围的单引号。
https://unix.stackexchange.com/questions/377492
复制相似问题