我使用的是一个可以在一行中输出所有数据的天气API。如何使用grep获取" summary"的值?和" apparentTemperature"?我对正则表达式的命令基本上不存在,但我已经准备好学习了。
cmd=yourcomand;
n=0; for a in "$@"; do n=$((n +1)); cmd="$cmd \${$n+\"\$$n\"}"; done
eval $cmd
谢谢!
答案 0 :(得分:2)
如何使用grep获取" summary"的值?和" apparentTemperature"?
您使用grep
&#39} -o
标记,这样只会输出匹配的部分。
由于您对正则表达式了解不多,我建议您学习使用JSON解析器,这更适合此任务。
例如,对于jq
,以下命令将提取当前摘要:
<whatever is your JSON source> | jq '.currently.summary'
答案 1 :(得分:1)
假设您的单行数据包含在名为ConfigurationManager.AppSettings["ApiBaseEndpoint"].ToString()
的变量中。
如果您确定该字段仅在整行中出现一次,您可以在Bash中执行以下操作:
DATA_LINE
除非您构建一个假设字段按特定顺序排列的更复杂的匹配表达式,否则您必须为每个字段执行一次此操作。
作为注释,匹配表达式if
[[ "$DATA_LINE" =~ \"summary\":\"([^\"]*)\" ]]
then
summary="${BASH_REMATCH[1]}"
echo "Summary field is : $summary"
else
echo "Summary field not found"
fi
在包含以下内容的子字符串的数据中找到第一个匹配项:
对于\"summary\":\"([^\"]*)\"
,代码会有所不同,因为该字段的格式不同。
apparentTemperature
答案 2 :(得分:0)
如果你的技能有限,这很容易理解 - 比如我的!假设您的字符串位于名为$LINE
的变量中:
summary=$(sed -e 's/.*summary":"//' -e 's/".*//' <<< $LINE)
然后检查:
echo $summary
Clear
执行(-e
)2 sed
个命令。第一个替换为summary":"
的所有内容,没有任何内容,第二个替换第一个剩余的双引号和随后的所有内容。
提取表观温度:
appTemp=$(sed -e 's/.*apparentTemperature"://' -e 's/,.*//' <<< $LINE)
然后检查:
echo $appTemp
-3.34
答案 3 :(得分:0)
正如亚伦(Aaron)所言,像jq
这样的json解析器是解决此问题的正确工具,但是由于问题是关于grep
的,所以让我们来看看一种解决方法。
假设您的API返回值位于$json
中:
json='{"latitude":59.433335,"longitude":24.750486,"timezone":"Europe/Tallinn","offset":2,"currently":{"time":1485880052,"summary":"Clear","icon":"clear-night","precipIntensity":0,"precipProbability":0,"temperature":0.76,"apparentTemperature":-3.34,"dewPoint":-0.13,"humidity":0.94,"windSpeed":3.99,"windBearing":262,"visibility":9.99,"cloudCover":0.11,"pressure":1017.72,"ozone":282.98}}'
您在括号中看到的模式为上下文匹配的回顾式和超前式断言。它们可以与-P
Perl regex选项一起使用,并且不会在输出中捕获。
summary=$(<<< "$json" grep -oP '(?<="summary":").*?(?=",)')
apparentTemperature=$(<<< "$json" grep -oP '(?<="apparentTemperature":).*?(?=,)')