简约'sed'应表现为“常规”sed。需要帮助解析

时间:2012-10-10 12:10:15

标签: sed

我正在使用解析JSON的脚本。我知道,我知道,你永远不应该这样做。但是剧本很多地使用它。这就是为什么它会遇到麻烦。 我在BusyBox上使用它,而且它只是sed的简约版本。

这是它遇到麻烦的地方。这是JSON输出:

{"expires": "Thu, 11 Oct 2012 11:30:29 +0000", "upload_id": "hhgJHflih753jDhhod", "offset": 293876}

这是用于获取" offset"的值的sed命令。在busybox上发挥作用:

sed -n -e 's/.*"offset":\s*\([^}]*\).*/\1/p'

这是获取upload_id的命令,这在BusyBox上不起作用:

sed -n -e 's/.*"upload_id":\s*"*\([^"]*\)"*.*/\1/p'

我真的很感激,如果有人可以帮助我让它工作以获得" upload_id"在带有简约sed的BusyBox上。 谢谢!

3 个答案:

答案 0 :(得分:0)

使用cut

$ # get upload_id
$ echo '{"expires": "Thu, 11 Oct 2012 11:30:29 +0000", "upload_id": "hhgJHflih753jDhhod", "offset": 293876}' |\
cut -d'"' -f8
hhgJHflih753jDhhod
$ # get offset
$ echo '{"expires": "Thu, 11 Oct 2012 11:30:29 +0000", "upload_id": "hhgJHflih753jDhhod", "offset": 293876}' |\
cut -d':' -f6 | cut -d' ' -f2 | cut -d'}' -f1
293876

这是极简主义的。

修改

使用gawk

$ echo '{"expires": "Thu, 11 Oct 2012 11:30:29 +0000", "upload_id": "hhgJHflih753jDhhod", "offset": 293876}' |\
gawk -F'"' '{print $8}'       
hhgJHflih753jDhhod

答案 1 :(得分:0)

使用awk的一种方式:

awk -F "[:,]" '{ for (i=1; i<=NF; i++) if ($i ~ /upload_id/) { gsub(/[" {}]/,"",$(i+1)); print $(i+1) } }' file.txt

结果:

hhgJHflih753jDhhod

请注意,这适用于offsetupload_id字段,但不适用于expires字段。 HTH。

答案 2 :(得分:0)

的grep:

grep -Po '(?<=upload_id": ")[^"]*' 

sed的:

sed -r 's/.*upload_id": "([^"]*).*/\1/'