使用sed反向引用重复模式

时间:2014-11-30 11:41:12

标签: 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/'

但是我很好奇第一个版本不起作用的原因?

2 个答案:

答案 0 :(得分:1)

  • [^ ]*匹配任何不是空格的字符零次或多次加上以下单个空格。
  • ([^ ]* )会捕获上述匹配的字符。稍后我们可以通过反向引用来引用该组。像\1
  • ([^ ]* ){3}重复模式三次。由于[^ ]*仅被捕获,因此必须返回最后一场比赛。要获得整体,您还需要在捕获组中包含重复量词{3}

答案 1 :(得分:0)

在第一个版本中,每次重复捕获组时,捕获组的内容都会被新内容覆盖。因此,此捕获组仅包含最后一次出现是正常的。

显然,捕获组并不存储历史记录" 之前匹配的内容(前一个匹配)(除了一些特殊的正则表达式,如python的新正则表达式模块)

即使您重复捕获组,该组的数量也不会改变。此数字由模式中左括号的位置定义。