将 sed 命令写入输入文件

将 sed 命令写入输入文件

我正在构建一个脚本来自动化样板。在其中,我附加了一个字符串:

"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

结果与使用两个更简单的命令的管道相同,并且根据您的脚本和其他情况,您要么想这样做,要么像上面显示的那样。

相关内容