shell中命令末尾的额外字符

时间:2018-01-29 05:25:05

标签: json shell sed

我正在尝试运行以下脚本:

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。可能是什么原因?

1 个答案:

答案 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>