在 mac 上使用正则表达式和 sed 不会产生预期的结果

在 mac 上使用正则表达式和 sed 不会产生预期的结果

我的文件包含以下几行,我想用脚本进行调整。

module.exports = {
  parserOptions: {
    project: ['./tsconfig.json'],
  },
... more stuff here
}

所以它看起来像这样。我并不真正关心结果中的空格。

module.exports = {
  parserOptions: {
    project: ['./tsconfig.json'],
    tsconfigRootDir: __dirname
  },
... more stuff here
}

我现在拥有的是:

sed -r "s/project:\s*\['.\/tsconfig.json'\],/project:\['.\/tsconfig.json'\],\ntsconfigRootDir\:__dirname/g" filename

但它没有匹配。我尝试了这个网站上的匹配模式https://sed.js.org/index.html?snippet=y7KG95在那里我得到了我想要的结果。我也尝试使用sed -E但没有运气。

我想说脚本设置工作正常,因为改变一些简单的东西就像s/project/projectA/g工作得很好。

谢谢!

使用 macOS 蒙特利 12.5.1

答案1

您正在使用-r\s、 和\n进行替换,它们都是 GNU 主义(当然\s更多的是 perl'ism)。这\:也是非标准的。而你却\在前面失踪.

标准情况下,语法为:

sed 's@^\([[:blank:]]*\)project:[[:blank:]]*\['\''\./tsconfig\.json'\''\]@&,\
\1tsconfigRootDir: __dirname@g' filename

[[:blank:]]代替\s(嗯,\s会更多[[:space:]],但这里应该足以匹配空格(\h在 perl 中)),\后跟换行符以在替换中包含换行符。

我们捕获行上的前导空白,project以使用相同的缩进缩进添加的行(\1回想一下捕获组)。

检查语法你的 sed实施和版本,检查它是文档,带有maninfo,而不是互联网上可能描述不同实现或版本的随机页面。

sed另请参阅该实用程序的 POSIX 2018 标准规范那里

相关内容