bash处的正则表达式语法如何?

How is the syntax of regular expression at bash?

我创建了一个最终适用于我的案例的正则表达式

: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) or files (file1,file2, file3 ),但我仍然无法得到任何东西。我的意思是,每次我执行 grep 时,我什么都得不到。我认为,问题一定出在某些符号中,例如“\n”或“+”,但我没有成功。如果我执行类似

grep -Po ':pkcs7-data' file.txt

我取得了不错的成绩。一旦我开始使用诸如行尾之类的符号,问题就开始了。

Grep 是一个基于行的正则表达式工具,它不像您拥有的那样处理多行模式。您应该使用 Perl 或将您的问题改写为 sed 或 awk。

一个awk解决方案:

awk  'BEGIN{FS=" +|:"}/:pkcs7-data/{getline;getline;print ;exit }' file.txt

pcregrep(如果可用)是处理多行的好工具 regex 但我找不到只获取匹配组的方法:

pcregrep -M -o '(?<=:pkcs7-data)\n.+\n\s+(\d+)' file.txt

感谢@Rob 和@klashxx,我找到了解决方案。正如@Rob 所说

"Grep is a line based regular expression tool, it does not handle multi-line patterns like what you have. You should be using Perl or rework your problem into sed or awk."

因此 grep 将被丢弃。之后,@klashxx 补充道:

An awk solution:

awk 'BEGIN{FS=" +|:"}/:pkcs7-data/{getline;getline;print }' file.txt

pcregrep (if avaliable) is a nice tool to handle multiline regex but i'm can't find a way to get only the matched group:

pcregrep -M -o '(?<=:pkcs7-data)\n.+\n\s+(\d+)' file.txt

我试着用awk解决了。对于我来说,使用 @klashxx awk 解决方案的唯一问题是我只想获得第一次出现。所以我做了一些研究,发现 awk exit 停止了 awk 的执行。所以在第一次出现后,它就会停止。

awk 'BEGIN{FS=" +|:"}/:pkcs7-data/{getline;getline;print ; exit;}' file.txt

现在可以使用了。非常感谢您的帮助。

亲切的问候, 安德烈斯-J。奶油