在没有 grep -oP 的情况下解析简单的 JSON

在没有 grep -oP 的情况下解析简单的 JSON

这是我的 JSON:

{"login":"WG1118412764OA","password":"9Hv1zd74nKhYovZa"}

我有非常基本的 grep,没有 Python,没有 Perl,显然也没有 jq,只有 awk 和 sed。

有人可以帮我吗?

我需要将登录名和密码值作为 shell 变量。

谢谢

卡尔800

答案1

cut如果您builtin只需要工具,则可以选择;-)

OLD_IFS="$IFS"
IFS='"'
set -- $(<file)
IFS="$OLD_IFS"

login=$4
password=$8

甚至:

IFS='"' read -r a b c login d e f password g < file

json请注意,您的输入或内部密码的轻微更改"都会出现问题。

最好使用适当的json解析器,例如jq。如果您没有,请安装它或让管理员为您安装。始终拥有适合您任务的工具!

答案2

假设您拥有所有必需的 POSIX 工具,而不仅仅是 awk、sed 和 grep,您可以只使用cut如下所示的输入:

$ login=$(cut -d'"' -f4 file)
$ passwd=$(cut -d'"' -f8 file)
$ echo "$login"
WG1118412764OA
$ echo "$passwd"
9Hv1zd74nKhYovZa

如果这不是您所需要的全部,那么编辑您的问题以提供更真正具有代表性的示例输入/输出,包括不适用于的情况。

答案3

一条评论,提到要执行此任务的系统是OpenWrt路由器。自从jq可用对于 OpenWrt,使用它来提取所需数据似乎是个好主意:

eval "$(jq -r '"login=\(.login|@sh); password=\(.password|@sh)"' file)"

这用于jq创建两个 shell 分配。评估时,分配将解码并引用的用户名和密码分配给两个 shell 变量loginpassword

或者,如果您想解析文件两次:

login=$(jq -r '.login' file)
password=$(jq -r '.password' file)

相关内容