UPD伙计们,上面的陈述“这个问题已经在这里有了答案:”完全是错误的:那里没有答案。我知道sed,但这不是一个选择。看来这是不可能的。不是在bash中,不是在单线中,不是在2018年。
bash字符串替换支持正则表达式,但我找不到将匹配的字符串的一部分包含在替换中的方法。
以下内容无法满足我的要求
$ x=AbcdAbdcAbefAbfe
$ echo ${x//Ab[ef]/Zy\\1}
AbcdAbdcZy\1fZy\1e
$ echo ${x//Ab[ef]/AB\1}
AbcdAbdcAB1fAB1e
(事实上,我什至不能使用括号:
$ echo ${x//Ab/Zy}
ZycdZydcZyefZyfe
$ echo ${x//(Ab)/Zy}
AbcdAbdcAbefAbfe
)
我想要的可以通过一系列替换来实现:
$ x=AbcdAbdcAbefAbfe
$ t="$x"
$ t=${t//Abe/Zye}
$ t=${t//Abf/Zyf}
$ echo $t
AbcdAbdcZyefZyfe
但即使是[0-9],这也是一个漫长的故事。
代码运行很长,它应该是单行的,不会启动子流程。
编辑
评论中有 个答案。我在这里复制它:
这不是关于正则表达式的问题,并且该问题中的假设是错误的。问题中的第一句话是假的。参数扩展中的模式被视为全局。 – ghoti
您可能应该直接链接到this。该页面详细介绍了结束此讨论所需的一切。 – revo