grep落后于锚意外的结果

时间:2019-02-23 23:23:57

标签: grep gnu

为什么这个锚定的lookbehinnd断言不能按预期工作?

$ grep -Po '^(?<=field_one: ).*' <<< "field_one: 123" # no match. non-zero exit. why?

$ grep -Po '(?<=field_one: ).*' <<< "field_one: 123"  # match, no anchor
123
$ grep -Po '(?<=^field_one: ).*' <<< "field_one: 123" # match, anchor inside lookbehind
123
$ grep -Po '^(field_one: ).*' <<< "field_one: 123"    # match, no lookbehind
field_one: 123

grep版本:grep(GNU grep)3.1

1 个答案:

答案 0 :(得分:1)

您不能指望^(?<=field_one: ).*与任何字符串匹配,因为^与字符串位置的开头匹配,然后(?<=field_one: ) positive lookbehind立即需要field_one: 在当前位置的左侧。后退模式仅在字符串的开头进行检查。字符串开头之前不能有文本,这是一种永远不会匹配任何字符串的正则表达式。

使用

grep -Po '(?<=^field_one: ).*' <<< "field_one: 123"

^放在后面的^中将作为环视检查的一部分,并将在每个位置进行测试,如果找到的位置紧靠field_one: 在字符串的开头,将返回一个匹配项。

另一种选择:

grep -Po '^field_one:\s*\K.*' <<< "field_one: 123"
                     ^^^^^

在这里,不使用任何向后搜索,^field_one:\s*模式在字符串开头匹配field_one:,然后使用0+空格,\K operator丢弃到目前为止所有匹配的文本。仅返回与.*进一步匹配的文本。

请参见online grep demo