【问题标题】:Regex to match as few many times as possible (lazy) using grep正则表达式使用 grep 尽可能少地匹配(惰性)
【发布时间】:2015-10-26 18:11:42
【问题描述】:

我对正则表达式很陌生。我在 txt 文件中有以下简单的行。

This one has some different PATTERNs, including PTTRN, and PTN, then it repeats PTTRN and PATTERN

使用grep -E,我想匹配第一个 PATTERN 和第一个 PTTRN 之间的所有内容,而不会将匹配扩展到第二个 PTTRN。

我试过了

PATTERN.*?PTTRN

这似乎适用于https://regex101.com/r/qI4aA6/8

但是当我尝试在终端中使用 grep 时,它会一直着色到第二个 PTTRN,即

PATTERNs, including PTTRN, and PTN, then it repeats PTTRN

此外,我在我的 ubuntu 系统上使用默认的 grep (gnu grep)。

【问题讨论】:

  • 你用过grep -P吗?
  • 它适用于 -P 选项,但我真正想要的是使用 -E 选项(扩展正则表达式)......我忘了提到它。我是正则表达式的新手,所以我没有意识到 Perl 正则表达式和扩展正则表达式之间存在差异。无论如何,谢谢

标签: regex shell command-line terminal grep


【解决方案1】:

您可以将-P (PCRE) 标志与 gnu-grep 一起使用:

grep -oP 'PATTERN.*?PTTRN' file
PATTERNs, including PTTRN

否则在 BSD 上 grep:

grep -oE 'PATTERN.*?PTTRN' file
PATTERNs, including PTTRN

【讨论】:

  • 正如我对我的帖子的第一条评论所说,它适用于 -P 选项,但我真正想要的是使用 -E 选项(扩展正则表达式)......我是正则表达式的新手,所以我没有意识到 Perl 正则表达式和扩展正则表达式之间存在差异。此外,我正在使用 gnu-grep。我要换个问题。
  • gnu-grep 不喜欢 lazy 量词,所以 -P 是唯一的选择,否则使用 awk。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-09
  • 2013-02-08
  • 2015-07-11
  • 1970-01-01
相关资源
最近更新 更多