【问题标题】:Grep non capturing group and capturing group in the same regex. Print only the capturing groupGrep 非捕获组和捕获组在同一个正则表达式中。仅打印捕获组
【发布时间】:2019-11-25 14:56:30
【问题描述】:

我有一个包含以下内容的文件:

VERSION = 1.1.1
version = 1.1.1
VERSION = "1.1.1"
VERSION = '1.1.1"

我正在尝试使用 grep 获取版本号:

grep -E "(VERSION|version|Version)[^0-9]*([0-9]+\.[0-9,A-Z,a-z]+\.[0-9,a-z,A-Z]+)" -oP setup.py

这抱怨“指定的匹配器冲突”。大概是因为有两个捕获组。我试图使第一组不捕获:(?:VERSION|version|Version),但这会产生相同的错误。在 regex101 (https://regex101.com/r/21Pkp2/1) 上测试时,具有非捕获组的版本确实有效,所以我不确定为什么它在 grep 中不起作用。

【问题讨论】:

  • 你不能同时使用E (ERE) 和-P (perl 模式)
  • 哦,删除 -E 不再出错,而是打印整行,而不仅仅是捕获组
  • 你可以使用:grep -ioP "version\D*\K(\d+\.[\d,A-Z,a-z]+\.[\d,a-z,A-Z]+)" file

标签: regex grep


【解决方案1】:

您不能在gnu grep 中同时使用-E (ERE) 和-P (perl 模式) 选项。如果您使用的是gnu grep,那么只需坚持使用-P 并使用此命令获取所有版本号:

grep -ioP "version\D*\K(\d+\.[\d,A-Z,a-z]+\.[\d,a-z,A-Z]+)" file

1.1.1
1.1.1
1.1.1
1.1.1
  • -i 用于忽略大小写匹配。
  • \K 是 PCRE 指令,用于丢弃以前匹配的信息

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 2015-07-24
    • 2018-01-15
    • 1970-01-01
    • 2018-09-08
    • 1970-01-01
    相关资源
    最近更新 更多