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。奶油
我创建了一个最终适用于我的案例的正则表达式
: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。奶油