引号之间的Grep模式

时间:2015-04-22 20:41:41

标签: regex grep

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

  Top Container View constraints:
     - Top Space to Top Layout Guide
     - Leading Space to container
     - Trailing Space to container
     - Vertical Space to Bottom Container View
     - Height

  Bottom Container View constraints:
     - Bottom Space to Bottom Layout Guide
     - Leading Space to container
     - Trailing Space to container

我想输出:A234DG3

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

经过一段时间的游戏后,我想出了以下内容,但它并没有出现我喜欢的内容

some stuff "A234DG3" maybe more stuff

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

3 个答案:

答案 0 :(得分:0)

使用基本或扩展的POSIX正则表达式无法使用grep提取引号之间的值。因为我会使用sed来获得便携式解决方案:

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

但是,有了GNU好东西,GNU grep将支持带有-P命令行选项的PCRE表达式。你可以用这个:

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

.*"匹配所有内容,直到第一个引用 - 包括它。 \K选项清除匹配缓冲区,因此就像一个方便,动态的lookbehind断言。 (我本可以使用真正的 lookbehind但我喜欢\K)。 [^"]+匹配引号之间的文字。 (?=")是一个先行断言,匹配后的确保将跟随" - 不包括在匹配中。

答案 1 :(得分:0)

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

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

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

你可能想要一个更像"[^"]*"的模式来匹配open-quote,任意数量的其他东西,然后是一个接近的引用。

答案 2 :(得分:0)

所以在经过更多的游戏之后,我想出了这个,这给了我以后我所做的:

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

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