为什么这个与 sed 一起使用的正则表达式会导致解析错误?

Why do this regular expression used with sed result in a parse error?

我正在尝试使用 sed'version' => '1.2.3', 替换为 'version' => '1.2.4',

这是我尝试过的方法:

echo " 'version' => '1.2.3', " | sed -E 's/([\s]*[\"\']version[\"\'][\s]*=>[\s]*[\"\'])[-_a-zA-Z0-9\.]+([\"\'][,]?)/.2.4/'

这是我的 shell 告诉我的:

zsh: parse error near `)'

我在一些在线正则表达式测试仪上尝试了相同的正则表达式(减去替换部分),它似乎在那里工作。那么,当我将它与 sed 一起使用时,为什么它不起作用?

单引号中的单引号不能反斜杠。在zsh中,可以用''把单引号换成单引号,或者用更便携的'\''(在bash和zsh都测试过):

echo " 'version' => '1.2.3', " \
| sed -E 's/(\s*[\"'\'']version[\"'\'']\s*=>\s*[\"'\''])[-_a-zA-Z0-9\.]+([\"'\''],?)/.2.4/'

我也把[\s]改成了\s,把[,]改成了,,因为它们是等价的,但后者更简单。