【问题标题】:Replace an entire line in package.json using bash tools使用 bash 工具替换 package.json 中的整行
【发布时间】:2017-07-10 09:20:52
【问题描述】:

我正在开发一个命令行,它将为 nodejs 项目安装每个必需的节点。

目前你可以这样做:

sudo gen-web-app express

这将生成您开始为 expressjs 开发所需的一切。

我正在工作

sudo gen-web-app reactjs

一切正常,除了我必须手动进入 package.json 并将启动脚本添加到文件中。 我知道在 BASH 中使用 SED 可以做到这一点,但我需要一些使用 sed 的帮助。

这是文件:

{
  "name": "test",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "nodemon": "^1.11.0",
    "path": "^0.12.7",
    "react": "^15.6.1",
    "webpack": "^3.1.0",
    "webpack-dev-server": "^2.5.1"
  }
}

我想替换以下内容,但我希望能得到一点帮助:)

"test": "echo \"Error: no test specified\" && exit 1"

"start": "webpack-dev-server"

【问题讨论】:

  • 这是您可以使用sed 完成的最基本任务。想查看它的文档或快速教程吗?此外,如果可能,您应该避免使用sed,并使用能够理解JSON 格式的工具,例如jq
  • 不要使用像 sed 这样的非 JSON 语法感知解析器,使用用于 JSON 解析的 jq。可以下载安装jq吗?

标签: bash sed jq


【解决方案1】:

Download and install jq - 命令行JSON 语法感知解析器,可让您修改.json 文件。对于您有问题的示例。

tmp=$(mktemp)    
jq '.scripts.start = "webpack-dev-server" | del(.scripts.test)' input.json > "$tmp" && mv "$tmp" input.json

将生成最终的.json 文件

{
  "name": "test",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "start": "webpack-dev-server"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "nodemon": "^1.11.0",
    "path": "^0.12.7",
    "react": "^15.6.1",
    "webpack": "^3.1.0",
    "webpack-dev-server": "^2.5.1"
  }
}

您可以在jqplay.org 开发的免费游乐场中与jq 一起玩。

【讨论】:

  • 感谢您的回答,将调查 JQ :) !
【解决方案2】:
$ sed -ie 's/\"test\": \"echo \\\"Error: no test specified\\\" && exit 1\"/\"start\": \"webpack-dev-server\"/g' file
$ cat file
{
  "name": "test",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "start": "webpack-dev-server"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "nodemon": "^1.11.0",
    "path": "^0.12.7",
    "react": "^15.6.1",
    "webpack": "^3.1.0",
    "webpack-dev-server": "^2.5.1"
  }
}

【讨论】:

    【解决方案3】:

    使用jq 的另一个选项是简单地覆盖.scripts 的值:

    jq '.scripts = { start: "webpack-dev-server" }' file.json
    

    【讨论】:

      猜你喜欢
      • 2021-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-31
      • 1970-01-01
      • 2013-09-27
      • 1970-01-01
      • 2016-09-14
      相关资源
      最近更新 更多