我正在尝试使用代码库来查找引号之间的字母数字代码。因此,例如我的代码库可能包含行
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应该给我我想要的东西,但我最好还是用别的东西吗?干杯!
答案 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}长度匹配器