【问题标题】:How is the syntax of regular expression at bash?bash 中正则表达式的语法如何?
【发布时间】: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.

标签: regex bash grep rhel


【解决方案1】:

awk 解决方案:

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

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

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

【讨论】:

  • 您的解决方案几乎完美无缺。使用我开发的正则表达式,我只得到了一次,而使用你的,我得到了两次。如果我必须得到 61,你传给我的那个我得到 61 和 2861。你能建议我一些 awk 语法文件或 web 吗?
  • 我想我找到了!使用 awkawk 'BEGIN{FS=" +|:"}/:pkcs7-data/{getline;getline;print $2;exit;}' file.txt 这样,在第一次出现后,awk 停止,然后我得到了我正在寻找的东西
【解决方案2】:

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

【讨论】:

  • 我得去上班,但你听起来很聪明,我相信你会明白的。
  • 感谢您的评论 XD 您应该知道这是我开设的第三个 Stackoverflow 帐户。由于我的“愚蠢”问题,他们禁止了我两次。从那时起,我学会了提问什么以及如何提问。干杯
【解决方案3】:

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

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

所以 grep 将被丢弃。之后,@klashxx 补充道:

一个 awk 解决方案:

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

pcregrep(如果可用)是处理多行的好工具 正则表达式,但我找不到仅获取匹配组的方法:

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

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

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

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

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

【讨论】:

  • 请将其中一个答案标记为已接受,这样这个问题就不会再出现未解决的问题。谢谢。
猜你喜欢
  • 1970-01-01
  • 2012-03-26
  • 2022-10-24
  • 1970-01-01
  • 1970-01-01
  • 2019-12-11
  • 1970-01-01
  • 2012-05-06
  • 2013-09-13
相关资源
最近更新 更多