我正在构建一个脚本来自动化样板。在其中,我附加了一个字符串:
"compile": "browserify js/main.js > ./dist/bundle.js -t babelify",
"watch": "watchify js/*.js -o ./dist/bundle.js -d",
使用 sed,我找到了字符串“脚本”并附加,如此。
sed '/"scripts"/a "compile": "browserify js/main.js > ./dist/bundle.js -t babelify",\n "watch": "watchify js/*.js -o ./dist/bundle.js -d",' package.json
因此,该命令的语法如下:
sed '/pattern/a' input
我的问题是这个命令不会改变输入文件,我也不能将输出写入文件,例如,
sed '/pattern/a' input > output.txt
我究竟做错了什么?
目标:
输入文件 (package.json
):
{
"name": "torrent-search-api",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"dependencies": {
"torrent-search-api": "^2.1.4"
},
"devDependencies": {
"@babel/core": "^7.16.7",
"@babel/preset-env": "^7.16.8",
"babelify": "^10.0.0",
"browserify": "^17.0.0"
}
}
$ <command> package.json
输出:
cat package.json
{
"name": "torrent-search-api",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"compile": "browserify js/main.js > ./dist/bundle.js -t babelify",
"watch": "watchify js/*.js -o ./dist/bundle.js -d",
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"dependencies": {
"torrent-search-api": "^2.1.4"
},
"devDependencies": {
"@babel/core": "^7.16.7",
"@babel/preset-env": "^7.16.8",
"babelify": "^10.0.0",
"browserify": "^17.0.0"
}
}
答案1
要将单个键值对添加到对象scripts
:
jq --arg key 'compile' --arg value 'browserify js/main.js > ./dist/bundle.js -t babelify' \
'.scripts += { ($key): $value }' file
添加两个键和值,只需再次通过完全相同的jq
表达式管道输出,但使用内部$key
和$value
变量的其他值:
jq --arg key 'compile' --arg value 'browserify js/main.js > ./dist/bundle.js -t babelify' \
'.scripts += { ($key): $value }' file |
jq --arg key 'watch' --arg value 'watchify js/*.js -o ./dist/bundle.js -d' \
'.scripts += { ($key): $value }'
鉴于问题中的文件,这将产生
{
"name": "torrent-search-api",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"compile": "browserify js/main.js > ./dist/bundle.js -t babelify",
"watch": "watchify js/*.js -o ./dist/bundle.js -d"
},
"author": "",
"license": "ISC",
"dependencies": {
"torrent-search-api": "^2.1.4"
},
"devDependencies": {
"@babel/core": "^7.16.7",
"@babel/preset-env": "^7.16.8",
"babelify": "^10.0.0",
"browserify": "^17.0.0"
}
}
您可以将第二个命令的输出重定向jq
到一个新文件,然后将该文件移动到旧名称,就像通常所做的那样。
如果您了解 ,您显然可以一次性执行这两个操作$ARGS.named
,这是一个在命令行上包含命名变量的对象:
jq --arg compile 'browserify js/main.js > ./dist/bundle.js -t babelify' \
--arg watch 'watchify js/*.js -o ./dist/bundle.js -d' \
'.scripts += $ARGS.named' file
结果与使用两个更简单的命令的管道相同,并且根据您的脚本和其他情况,您要么想这样做,要么像上面显示的那样。