Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 使用sed反向引用重复模式_Regex_Sed - Fatal编程技术网

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}

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

显然,捕获组不会存储以前匹配的内容(通过以前的匹配)的“历史记录”。(除了一些特殊的正则表达式风格,比如python的新正则表达式模块)


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

您期望的输出是什么?
([^]*){3}
总是返回最后一个匹配项。@AvinashRaj:这正是我想知道的。如果不是作为一个整体考虑,我希望它被视为三种模式,因此
\1
将引用第一个匹配,而
\3
将引用最后一个匹配。为什么第一场比赛被淘汰,而不是最后一场?如果你发布你真正的问题,而不仅仅是一个例子,我们也许可以帮助解决它。使用其他程序,如
awk
,可能以不同的方式解决它,可能不需要任何复杂的正则表达式。@Jotne:哪个是真正的问题?我不是要一个解决方案,而是要一个解释。答案就在问题中。我接受第一个参数的答案,但我看不出第二段是如何“显而易见”的。
echo "a b c d"|sed -r 's/^(([^ ]* ){3})/\1/'