【发布时间】:2015-12-03 13:30:34
【问题描述】:
我创建了一个最终适用于我的案例的正则表达式
:pkcs7-data\n.+\n\s+(.+?):
您可以在这里查看它的工作原理REGEX101 link 它必须找到某个有效数字的第一次出现。
我使用 REGEX101 构建了它,但我必须在 bash 终端中使用它。我的想法是在 grep 命令中使用该正则表达式,该命令也可以作为文件的输入。
grep -Po ':pkcs7-data\n.+\n\s+(.+?):' file.txt
我的问题是我使用的 REGEX101 语法不适合这个 bash
bash --version
GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
我查找了一些工具 (tool1) 或文件 (file1,file2, file3),但我仍然无法得到任何东西。我的意思是,每次我执行 grep 我什么都没有得到。我认为,问题一定出在“\n”或“+”等符号中,但我没有成功。如果我执行类似
grep -Po ':pkcs7-data' file.txt
我取得了不错的成绩。一旦我从行尾之类的符号开始,问题就开始了。
【问题讨论】:
-
问题不在于正则表达式本身,而是
bash不会将\n解释为文字换行符,grep也不会。 -
另外,供将来参考:bash also 具有正则表达式,但在您的问题中,您实际上指的是
grep的正则表达式语法。 GNU grep 实现了三种不同的语法:BRE、ERE 和 PCRE(Posix grep 只需要前两种),并带有一些扩展名(例如\s表示空格字符)。 bash 正则表达式是没有扩展名的 ERE 格式(afaik)。 BRE 和 ERE 记录在man 7 regex(以及其他地方)中。 -
另外,仅供参考,在 FreeBSD 中,grep 命令不包括 PCRE,但是可以安装一个“端口”(devel/pcre),它提供了
pcregrep,具有类似的功能grep -P.