【发布时间】:2018-10-16 04:45:35
【问题描述】:
我有一个文件cases:
foo
bar
cases:
1: foo
2: bar
baz
cases:
3: baz
quux
由于缩进总是在我想用grep -zoP '(\s*)cases:\n(\1.*\n)*' cases 列出案例之后再次返回,但是输出
cases:
cases:
而如果我使用grep -zoP '(\s*)cases:\n(\1.*\n){1,}' cases,我会得到我想要的输出:
cases:
1: foo
2: bar
cases:
3: baz
我尝试过的任何类似的正则表达式都不会出现这种行为:
$ grep -o '\(foo\)bar\(\1\)*'<<<$'foobarfoofoofoofoo'
foobarfoofoofoofoo
$ grep -o '\(foo\)bar\(\1\)*'<<<$'foobarfoofoofoofoobax'
foobarfoofoofoofoo
$ grep -oP '(foo)bar(\1)*'<<<$'foobarfoofoofoofoobax'
foobarfoofoofoofoo
$ grep -zoP '(foo)bar(\1)*'<<<$'foobarfoofoofoofoobax'
foobarfoofoofoofoo
$ grep -zoP '(foo)\n*bar'<<<$'foo\n\n\n\n\n'
foo
$
为什么 grep 喜欢匹配我的正则表达式 0 次?
【问题讨论】:
-
最后一个例子对吗?我还在它的末尾得到
bar。还有,你最后一句话好像被删了。 -
@BenjaminW。感谢您指出这一点,已修复。
-
我认为问题出在
\1,因为反向引用强制匹配完全相同的字符,如果空格数不同,则失败,即grep -zoP '(\s*)cases:\n(\s.*\n)*' cases