如何在bash脚本中处理正斜杠字符?



在一个包中。json,我试着替换它:

"main": "lib/index.js",
"types": "lib/index.d.ts",

By that:

"main": "./index.js",
"types": "./index.d.ts",
因此,我编写了一个简单的脚本,将字符串模式替换为一个点,如下所示:
sed 's/lib//.//g' package.json

当我在终端中输入它时它就工作了。

但是当它插入到包中时不能正常运行。json脚本。

package.json:

"build": "tsc && cp package.json lib/ && cd lib && sed 's/lib//.//g' package.json && npm publish ./lib"

输出:

sed: 1: "s/lib//.//g": bad flag in substitute command: '.'

它一直用正斜杠替换转义的反斜杠。

我怎样才能使它工作呢?

您更改了json文档,json中具有特殊含义。这也是一个转义字符。因此您需要转义您的转义字符:

s/lib\//.\//g

或为json解析器提供反斜杠的unicode值:

s/libu005c//.u005c//g

或者更简单,当您想要匹配的字符之一时,不要在sed中使用正斜杠作为分隔符:

sed 's,lib/,./,g'

注意,您实际上并没有修改文档。要做到这一点,添加sed选项-i

sed -i 's,lib/,./,g' package.json

注意:如果你使用的是BSD工具,你需要给-i添加一个空参数:

sed -i '' 's,lib/,./,g' package.json

或者通过而不是复制cd lib后面的文档来避免这个问题。您可以对原始文件进行sed,并将输出定向到新文件:

sed 's,lib/,./,g' package.json > lib/package.json

最新更新