【问题标题】:delete line from json file with sed in a shell在 shell 中使用 sed 从 json 文件中删除行
【发布时间】:2018-08-26 13:12:36
【问题描述】:

我想从 .package.json 中删除包含 "electron-inspector": "0.1.4", 的行

以下操作无效。

sed -i '' -e 'electron-inspector' ./package.json

我需要改变什么?

【问题讨论】:

  • 不要使用 sed 而是使用真正的 JSON 解析器,查看我的帖子
  • 如果您从问题中删除了“从 JSON 文件中”,则仅使用 sed 的答案可能是可以接受的。然而——sed无法解析 JSON;它无法确保其答案会产生可解析的、语义正确的输出文档。由于我们在 StackOverflow 上的目标是建立一个规范、正确答案的知识库,因此很难支持一种在用于问题中描述的目的时存在严重已知错误的方法。

标签: json bash sed


【解决方案1】:

您可以这样做,但 不是 JSON 解析器!

sed -i '' -e '/electron-inspector/d' file

(macOS 的 sed 需要-i ''

想象一个像这样的简单 (inline) 案例:

{"foo": 123, "electron-inspector": "0.1.4", "bar": 42 }

轰隆隆!所以:

正确的方法,使用

jq -r 'del(.["electron-inspector"])' file.json > _.json && mv _.json file.json

破折号-special case for jq

如果你有一个简单的案例,命令将是:

jq 'del(.electroninspector)' file.json    

查看JQ


使用 和... 的另一种解决方案:

cat file.json
{"foo": 123, "electron-inspector": "0.1.4", "bar": 42 }

代码:

$ node<<EOF > _.json && mv _.json file.json                                               
var o = $(< file.json);
delete o["electron-inspector"];
console.log(JSON.stringify(o, null, 4));
EOF

编辑文件:

{
    "foo": 123,
    "bar": 42
}

最后但同样重要的是,使用sponge 正确编辑文件:

我们可以代替:&gt; x.json &amp;&amp; mv x.json file.json

command ...... file.json | sponge file.json

您需要安装

【讨论】:

  • 其实.electron_inspector是特例。 .[x] 适用于 any 有效键 x,而 .x 仅适用于有效键的子集。
  • 顺便说一句,-i'' 等同于 -i,后面没有任何内容;因此,它适用于 GNU sed,但不适用于 BSD 实现(因为它导致下一个参数中的 -e 被视为要使用的扩展。
  • 这是来自 OP 问题,假设 OP 使用 MacOS。这就是使用 MacOS 的方式
  • @GillesQuenot, -i'' 没有空格在 MacOS 上不起作用;它实际上将与 sed -i -e ... 完全相同的参数向量传递给 sed。它必须是-i ''。用set -x运行,比较sed -i''sed -i的运行轨迹,你会发现它们是一样的。
【解决方案2】:

我可以使用它:

sed -i '/electron-inspector/d' package.json

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-15
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 2018-10-27
    • 2023-03-08
    • 2018-05-23
    • 2012-05-25
    相关资源
    最近更新 更多