引号之间的 Grep 模式

Grep pattern between quotes

我正在尝试 grep 代码库以查找引号之间的字母数字代码。因此,例如我的代码库可能包含行

some stuff "A234DG3" maybe more stuff

我想输出:A234DG3

我很幸运,因为我知道我的字符串有 7 长并且只有整数和字母 A-Z、a-z。

玩了一会儿之后,我想到了以下内容,但并不是我想要的

grep -ro '".*"' . | grep [A-Za-z0-9]{7} | less

我哪里错了?感觉 grep 应该给我想要的东西,但我最好还是使用其他东西吗?干杯!

使用基本或扩展 POSIX 正则表达式无法提取 grep 引号之间的值。从那时起,我将使用 sed 作为便携式解决方案:

sed -n 's/.*\"\([^"]\+\)".*//p' <<< 'some stuff "A234DG3" maybe more stuff'

但是,有了 GNU 的优点,GNU grep 将通过 -P 命令行选项支持 PCRE 表达式。你可以使用这个:

grep -oP '.*?"\K[^"]+(?=")' <<< 'some stuff "A234DG3" maybe more stuff'

.*" 匹配第一个引号之前的所有内容 - 包括它。 \K 选项会清除匹配的缓冲区,因此就像一个方便的动态回顾断言一样工作。 (我本可以使用 real 后视,但我喜欢 \K)。 [^"]+ 匹配引号之间的文本。 (?=") 是一个先行断言,确保匹配后将遵循 " - 不将其包含在匹配中。

问题是 RE 几乎需要匹配它可以匹配的最长 序列。所以,给出类似的东西:

a "bcd" efg "hij" klm "nop" q

".*" 的模式应该匹配:"bcd" efg "hij" klm "nop"(从第一个引号到最后一个引号的所有内容),而不仅仅是 "bcd".

您可能想要一个更像 "[^"]*" 的模式来匹配开引号、任意数量的其他内容,然后是闭引号。

所以在更多的尝试之后我想出了这个给了我我想要的东西:

grep -r -E -o '"[A-Za-z0-9]{7}"' . | less

使用 -E 允许使用 {7} 长度匹配器