求助,使用捕获 shell 输出的一个固定格式的地址,写入到指定 json 的某个字段中

2022-04-12 11:44:41 +08:00
 AirTag
shell 有如下输出

```shell
listen url is http://127.0.0.1:56099/AbcDEfJ-lr4=/
```

需要将上面的`http://127.0.0.1:56099/AbcDEfJ-lr4=/`写入到一个指定的 json 文件里面。
```json
{
"config": [
{
"listen": "http://127.0.0.1:56099/AbcDEfJ-lr4=/"
}
],
}
```

我现在一直是等 shell 输出这个地址然后手动复制粘贴到 json 文件里面。
感觉这样太复杂了,但是自己不是很会 shell 各种文本处理命令。
往上咕噜咕噜了一番也没有很好的解决这个问题。

所以想请教大家如何通过命令实现可以自动修改 json 文件里面对应的字段。

感谢!
701 次点击
所在节点    问与答
6 条回复
blackeeper
2022-04-12 15:59:22 +08:00
第一步,提取 url 。url=$(echo "listen url is http://127.0.0.1:56099/AbcDEfJ-lr4=/" |grep 'http://' |sed 's#^.*\( http:.*\)#\1#g')
第二步,替换 json file 内容。sed "s/http.*/$url\"/g" file.json
AirTag
2022-04-12 17:25:37 +08:00
@blackeeper 谢谢,url 中的 / 会引起 sed 转义错误,
网上搜索了下
sed "s~http.*~$url\"~g" file.json
就可以了
感谢
ysc3839
2022-04-12 18:10:16 +08:00
@blackeeper 需要这么麻烦吗? grep 就可以直接用正则表达式匹配
```
$ echo 'listen url is http://127.0.0.1:56099/AbcDEfJ-lr4\=/' | grep -Po 'http.+'
http://127.0.0.1:56099/AbcDEfJ-lr4\=/
```
保险一点可以带上前面的字符串
```
echo 'listen url is http://127.0.0.1:56099/AbcDEfJ-lr4\=/' | grep -Po 'listen url is \Khttp.+'
http://127.0.0.1:56099/AbcDEfJ-lr4\=/
```
AirTag
2022-04-13 10:58:15 +08:00
@ysc3839 我的是 mac 系统,用这个 grep 命令的时候提示参数不正确。
我也是因为 mac 自己的各种命令和网上讲的那些有很多不一致才不知道怎么搞。
还是很感谢。
ysc3839
2022-04-13 11:24:57 +08:00
@AirTag 可以改成 grep -Eo ,但是第二段就不正常了
Cusmate
2022-04-13 12:01:59 +08:00
如果 shell 的输出格式不变就用 awk 提取
shell 命令 | awk '{print "{\"config\":[{\"listen\":"$4"\"}]}"}'

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/846475

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX