为什么这个锚定的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
答案 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。