我正在尝试运行以下脚本:
sed -E -n '/"data"/,/}/{/[{}]/d;s/^[[:space:]]*"([^"]+)":[[:space:]]*"([^"]+)".*$/\1|\2/g;p}' /tmp/data.json | while IFS="|" read -r item val;do item="${item^^}"; item="${val}"; export "${item}"; echo ${item}; done
这基本上是从JSON内部导出数据作为环境变量。 也就是说,
这里,密钥数据将具有其自身内的键值对的列表(具有不同长度),其中密钥不是固定的。现在,我想读取列表中的每个键并导出其值。例如,我希望这些命令作为shell脚本的一部分执行。
导出HELLO1 export SAMPLEKEY
但是,当我运行它时,会出现错误:sed: 1: "/"data"/,/}/{/[{}]/d;s/ ...": extra characters at the end of p command
。可能是什么原因?
答案 0 :(得分:2)
而不是尝试使用sed
来解析.json文件(它可以快速超越合理的sed
解析),而是使用一个用于解析json的工具(如jq
- json查询)。您可以轻松获取data
下的值的键,然后使用shell工具进行解析。
(注意:您的问题应标记为 bash ,因为您使用参数展开作为基础的字符大小写,例如${item^^}
)
使用jq
,您可以执行以下操作:
jq '.data' /tmp/data.json | tail -n+2 | head -n-1 |
while read -r line; do line=${line#*\"}; line=${line%%\"*}; \
printf "export %s " ${line^^}; done; echo ""
导致输出结果:
export HELLO1 export SAMPLEKEY
(可能更简洁的方法是使用jq
执行此操作 - 并且有)
您可以让jq
每行输出data
一个密钥:
jq -r '.data | to_entries[] | (.key|ascii_upcase)' /tmp/data.json
这允许您缩短命令以使用以下代码生成export
in:
while read -r key; do \
printf "export %s " $key; \
done < <(jq -r '.data | to_entries[] | (.key|ascii_upcase)' /tmp/data.json); \
echo ""
(注意:以影响您的实际环境,您需要export
作为shell启动的一部分的值{/ p>