由于是在服务器上使用 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
希望能帮到有需要的人~