为什么这个正则表达式不适用于grep?

时间:2014-09-02 12:03:08

标签: regex macos bash grep

我有这样的文本文件

"an arbitrary string" = "this is the text one"
"other arbitrary string" = "second text"
"a third arbitrary string" = "the text number three"

我想只获得此

an arbitrary string
other arbitrary string
a third arbitrary string

即,第一个引号内的文字,或第一个"" =之间的文字。我用过这个正则表达式

(?!").*(?=(" =))

当我在RegExronline tool中尝试使用时,这是有效的。但是在我的OSX终端中,它不起作用,输出为空

grep -o '(?!").*(?=(" =))' input.txt

这里有什么问题?我是否必须逃避一些角色?我尝试每个人,没有任何改变。

非常感谢你,请原谅我对这个话题缺乏了解。

3 个答案:

答案 0 :(得分:2)

Lookaheads和lookbehinds是PCRE功能,因此您必须使用参数-P

grep -Po '(?!").*(?=(" =))' input.txt

答案 1 :(得分:1)

这应该做:

awk -F\" '{print $2}' file

它使用"作为分隔符,然后打印第二个字段。

答案 2 :(得分:1)

steffen`s answer是对的,你必须使用-P标志。但是你的正则表达式也存在问题。

想象一下这个输入: "an arbitrary string" = " =this is the text one"

你的正则表达式会大大失败。 要解决这个问题,你必须使用这样的东西:

grep -Po '^"\K.*?(?=(" =))'

  • ^以防止其他不从行开始的匹配。
  • \K更容易阅读。 (它还允许您匹配任意长度的字符串)
  • .*?让它变得非贪婪。