获取分配给变量的命令输出(BASH)

时间:2015-06-08 10:33:30

标签: bash awk sed

我正在运行一个命令,它基本上解析了一些JSON,然后使用awk和sed提取ID。

当我自己运行命令时,它会给出正确的输出,例如

cat CustomThemeProfile.json | sed -e 's/[{}]/''/g' | awk -v k="text" '{n=split($0,a,","); for (i=1; i<=n; i++) print a[i]}' | awk -F ":" '{print $0}' | grep id | awk -F ":" '{print $2}' | sed 's/\"//g'
2F13F732-4BCB-49DC-A0FB-C91B5DE58472

但是当我想将输出分配给变量时,我得不到任何回报。例如

cat CustomThemeProfile.json | id=$(sed -e 's/[{}]/''/g' | awk -v k="text" '{n=split($0,a,","); for (i=1; i<=n; i++) print a[i]}' | awk -F ":" '{print $0}' | grep id | awk -F ":" '{print $2}' | sed 's/\"//g'); echo $id

任何想法。我真的希望这是从一个脚本运行但是目前脚本什么都不做,坐着等待什么?

脚本我正在打电话。

第一个脚本只找到所有json文件,然后调用此脚本。所以文件传递

#!/bin/bash

echo "running search and replace script ..."

id="$(sed -e 's/[{}]/''/g' | awk -v k="text" '{n=split($0,a,","); for (i=1; i<=n; i++) print a[i]}' | awk -F ":" '{print $0}' | grep id | awk -F ":" '{print $2}' | sed 's/\"//g')"
filler="0-0000-0000-0000-000000000000"

echo $id

if [ $(#id) -ge 8]; then echo "New Profile ID in use"; exit
else idnew=$id$filler
fi

sed -i '"s/$id/$idnew/g"' $1

sed -i 's/ps_hpa/ps_hpa/g' $1

1 个答案:

答案 0 :(得分:0)

您需要稍微重新排列语法:

id=$(sed -e 's/[{}]/''/g' CustomThemeProfile.json | awk -v k="text" '{n=split($0,a,","); for (i=1; i<=n; i++) print a[i]}' | awk -F ":" '{print $0}' | grep id | awk -F ":" '{print $2}' | sed 's/\"//g')

注意我避免无用的cat并将文件直接传递给sed。这就是你的脚本什么都不做的原因 - sed正在等待一些输入。可以将cat移到命令替换中,但这样做没有任何好处。如果某个工具能够自己读取文件,那么您应该使用该功能。

更好的解决方案是使用jq正确解析您的JSON。为了让我们向您展示如何操作,您应该编辑您的问题以向我们展示您的输入样本。