![在 mac 上使用正则表达式和 sed 不会产生预期的结果](https://linux22.com/image/215324/%E5%9C%A8%20mac%20%E4%B8%8A%E4%BD%BF%E7%94%A8%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E5%92%8C%20sed%20%E4%B8%8D%E4%BC%9A%E4%BA%A7%E7%94%9F%E9%A2%84%E6%9C%9F%E7%9A%84%E7%BB%93%E6%9E%9C.png)
我的文件包含以下几行,我想用脚本进行调整。
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
实施和版本,检查它是文档,带有man
或info
,而不是互联网上可能描述不同实现或版本的随机页面。
sed
另请参阅该实用程序的 POSIX 2018 标准规范那里。