请考虑以下命令:
echo "a b c d"|sed -r 's/^([^ ]* ){3}/\1/'
它应该在行的开头用空格跟随{3}
次非空格字符,并将它们替换为自己(\1
)。
但是,结果不是我所期望的,\1
仅返回三场比赛的最后一次出现:
c d
虽然我期待
a b c d
解决方案是将{3}
个匹配项嵌入“单一模式”中:
echo "a b c d"|sed -r 's/^(([^ ]* ){3})/\1/'
但是我很好奇第一个版本不起作用的原因?
答案 0 :(得分:1)
[^ ]*
匹配任何不是空格的字符零次或多次加上以下单个空格。([^ ]* )
会捕获上述匹配的字符。稍后我们可以通过反向引用来引用该组。像\1
([^ ]* ){3}
重复模式三次。由于[^ ]*
仅被捕获,因此必须返回最后一场比赛。要获得整体,您还需要在捕获组中包含重复量词{3}
。答案 1 :(得分:0)
在第一个版本中,每次重复捕获组时,捕获组的内容都会被新内容覆盖。因此,此捕获组仅包含最后一次出现是正常的。
显然,捕获组并不存储历史记录" 之前匹配的内容(前一个匹配)。 (除了一些特殊的正则表达式,如python的新正则表达式模块)
即使您重复捕获组,该组的数量也不会改变。此数字由模式中左括号的位置定义。