Regex 使用sed反向引用重复模式
考虑以下命令:Regex 使用sed反向引用重复模式,regex,sed,Regex,Sed,考虑以下命令: 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/'
它应该在行首匹配{3}
乘以后跟空格的非空格字符,并将其自身替换(\1
)
但是,结果并非我所期望的,\1
仅返回三个匹配项的最后一个匹配项:
c d
当我期待的时候
a b c d
解决方案是将{3}
匹配项嵌入“单一模式”:
然而,我很好奇第一个版本不起作用的原因是什么?
匹配任何非空格零次或多次加上以下单个空格的字符[^]*
将捕获上述匹配字符。稍后,我们可以通过反向引用来引用该组。像([^]*)
\1
将模式精确重复三次。因为只捕获了([^]*){3}
,所以它必须返回最后一个匹配项。为了得到整体,您还需要在捕获组中包含重复量词[^]*
{3}
即使重复一个捕获组,该组的数量也不会改变。这个数字是由模式中左括号的位置定义的。您期望的输出是什么?
([^]*){3}
总是返回最后一个匹配项。@AvinashRaj:这正是我想知道的。如果不是作为一个整体考虑,我希望它被视为三种模式,因此\1
将引用第一个匹配,而\3
将引用最后一个匹配。为什么第一场比赛被淘汰,而不是最后一场?如果你发布你真正的问题,而不仅仅是一个例子,我们也许可以帮助解决它。使用其他程序,如awk
,可能以不同的方式解决它,可能不需要任何复杂的正则表达式。@Jotne:哪个是真正的问题?我不是要一个解决方案,而是要一个解释。答案就在问题中。我接受第一个参数的答案,但我看不出第二段是如何“显而易见”的。
echo "a b c d"|sed -r 's/^(([^ ]* ){3})/\1/'