引号之间的 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} 长度匹配器
我正在尝试 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} 长度匹配器