我正在尝试使用awk从字符串拆分初始化数组。 我期待令牌被“,”分隔,但不知何故他们没有。
输入是curl从地址http://www.omdbapi.com/?i=&t=the+campaign返回的字符串 我试图删除任何额外的回车或可能导致混淆的事情,但在我检查过的所有客户端看起来都是单行字符串。
{"Title":"The Campaign","Year":"2012","Rated":"R", ...
这是输出
-metadata {"Title":"The **-metadata** Campaign","Year":"2012","Rated":"R","....
应该是
-metadata {"Title":"The Campaign"
这是我的代码:
__tokens=($(echo $omd_response | awk -F ',' '{print}'))
for i in "${__tokens[@]}"
do
echo "-metadata" $i"
done
欢迎任何帮助
答案 0 :(得分:2)
我会认真对待@cbuckley的评论:使用json感知工具,而不是尝试使用简单的字符串工具解析该行。否则,如果带引号的字符串中包含逗号,则脚本将中断,例如。
无论如何,此练习不需要awk
,但它没有帮助您,因为awk
打破字符串的方式只对awk
感兴趣。将字符串打印到stdout
后,它仍然是一直相同的字符串。如果您希望shell使用,
作为字段分隔符,则必须告诉shell执行此操作。
这是一种方法:
(
OLDIFS=$IFS
IFS=,
tokens=($omd_response)
IFS=$OLDIFS
for token in "${tokens[@]}"; do
# something with token
done
)
(
和)
只是执行子shell中的所有操作,使shell变量成为临时变量。你可以不用。
答案 1 :(得分:1)
首先,请接受我的道歉:我手边没有最近的bash,所以我无法尝试下面的代码(没有数组!)
但它应该工作,或者如果没有,你应该能够调整它工作(或在下面询问,提供你所看到的一些上下文,我会帮助解决它)< / p>
nb_fields=$(echo "${omd_response}" | tr ',' '\n' | wc -l | awk '{ print $1 }')
#The nb_fields will be correct UNLESS ${omd_response} contains a trailing "\",
#in which case it would be 1 too big, and below would create an empty
# __tokens[last_one], giving an extra `-metadata ""`. easily corrected if it happens.
#the code below assume there is at least 1 field... You should maybe check that.
#1) we create the __tokens[] array
for field in $( seq 1 $nb_fields )
do
#optionnal: if field is 1 or $nb_fields, add processing to get rid of the { or } ?
${__tokens[$field]}=$(echo "${omd_response}" | cut -d ',' -f ${field})
done
#2) we use it to output what we want
for i in $( seq 1 $nb_fields )
do
printf '-metadata "%s" ' "${__tokens[$i]}"
#will output all on 1 line.
#You could add a \n just before the last ' so it goes each on different lines
done
所以我循环使用字段编号,而不是可能是某些空格或制表符分隔的值