我不明白我在这里缺少什么:
$ echo 'testing' | sed -E 's/([a-z]*)ing/\1ing/g'
ing
我希望输出testing
再次出现,因为\1
应该是test
?该输入似乎已被吞掉 - 即该组与它相匹配 - 但为什么\1
不将其吐出来?
我使用的是 macOS 10.12.2;使用 xonsh shell 和 GNU sed v4.3。
答案1
事实证明,xonsh(或Python)正在吞噬\1
,因此 sed 实际上看到了's/([a-z]*)ing/ing/g
,并且它的输出对于该输入来说当然是正确的。
我有在这里打开了一个问题关于它,但解决方法是使用 Python 原始字符串:
$ echo 'testing' | sed -E r's/([a-z]*)ing/\1ing/g'
testing
这比 escaping( \\1
) 更可取,因为它会在 POSIX shell 中出错,而不是继续执行不需要的操作\1
。
然而,感谢@adqm,双引号和转义反斜杠在 xonsh 和 bash 之间是可移植的:
$ echo 'testing' | sed -E "s/([a-z]*)ing/\1ing/g"