如何解决Mac上sed处理json文件出现sed: 1: “config.json“: command c expects \ followed by text B站录播姬添加房间的错误

由于是在服务器上使用 CLI 版的 B 站录播姬,添加房间的时候非常麻烦,每次都要修改config.json文件,而 JSON 文件内容是挤在一行的,复制添加新的房间还是有点麻烦的,有时候还可能会出现错误(比如丢个括号),导致录播停了也不知道。所以写个脚本来方便添加内容。

这个脚本的核心是使用sed替换添加一条新的房间数据,先介绍 Linux 上 GNU SED 的方法:

sed -i 's/]}$/,{"RoomId":{"HasValue":true,"Value":1111111111111111},"AutoRecord":{"HasValue":true,"Value":true}}]}/' config.json

这条命令可以说是最简单的sed替换文本命令了,其实就是sed -i 's/旧内容/新内容/ 文件',只不过“新内容”比较长。唯一需要注意的是“旧内容”的]}$表示是最后一个]},不然会替换所有的]}

但是如果你在 Mac 上使用这条命令,那么会出现下面的错误:

sed: 1: "config.json": command c expects \ followed by text

在 Mac 上需要多一个-e选项,如下:

sed -i -e 's/]}$/,{"RoomId":{"HasValue":true,"Value":21010537},"AutoRecord":{"HasValue":true,"Value":true}}]}/' config.json

顺道一提,这个命令由于某些原因(后面会说)在 GNU 上也可以使用。

这是因为 Mac 使用的是 FreeBSD 版本的 SED,与 Linux 上使用的 GNU 版本不太一样。这点可以通过man sed查看命令手册得知,如下:

请添加图片描述

请添加图片描述

二者-i在手册中描述很像,都表示替换,以及通过选项选择备份。本文中并不会备份,所以-i后面的参数全部为空'',也就可以不写。

GNU 版的-i的介绍如下:

请添加图片描述

FreeBSD 版的-i的介绍如下:

请添加图片描述

二者的区别在于,两个版本的sed命令逻辑和格式其实不太一样。

一个典型的sed命令的格式大致如下:

sed 操作 文件

在 FreeBSD 中,“操作”被称为command

请添加图片描述

而 GNU 中,“操作”被称为script

请添加图片描述

可以看到,GNU 版本的在没有选项的情况下可以直接使用操作,而 FreeBSD 中的则必须跟在一些选项后面,比如这里使用的-e选项。也可以看到 GNU 版本的-e起到类似的效果,但是二者的操作逻辑却不同。

最后脚本还是简单的:

#!/bin/bash

if [[ $1 =~ ^[0-9]+$ ]]; then
   sed -i -e 's/]}$/,{"RoomId":{"HasValue":true,"Value":'$1'},"AutoRecord":{"HasValue":true,"Value":true}}]}/' config.json
else
   echo "$1 is not a room number"
fi

注意sed操作中$1需要用单引号包裹,不然不会进行扩展。2

希望能帮到有需要的人~

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值