使用关键字解析字符串

使用关键字解析字符串

我正在使用 bash 命令,gps location它返回日期、时间和位置信息。

[john@hostname :~/develp] $ gps location
Location: {"date": "16/07/20", "time": "19:01:22", "latitude": "34.321", "longitude": "133.453", "altitude": "30m"}

我想将经度写入文件,在到达那里之前我需要正确解析该字符串。

[john@hostname :~/develp] $ variable=`gps location | awk '/"longitude":/ {print $9}'`
[john@hostname :~/develp] $ echo $variable
"133.453",
[john@hostname :~/develp] $

目前,awk不搜索经度,它只是获取整个字符串并找到第 9 个字符串。理想情况下,我想使用正则表达式/关键字方法并找到经度,然后找到下一个字符串。我尝试过使用grep | cut也尝试过sed。不走运,我能做的就是使用awk.

答案1

去掉后Location:你就剩下 JSON:

$ echo '{"date": "16/07/20", "time": "19:01:22", "latitude": "34.321", "longitude": "133.453", "altitude": "30m"}' |
    jq .longitude
"133.453"

请参阅手册页是否有一个不预先gps打印关键字的选项,如果不剥离它很容易,例如:Location:

$ echo 'Location: {"date": "16/07/20", "time": "19:01:22", "latitude": "34.321", "longitude": "133.453", "altitude": "30m"}' |
    cut -d':' -f2- | jq .longitude
"133.453"

或者:

$ echo 'Location: {"date": "16/07/20", "time": "19:01:22", "latitude": "34.321", "longitude": "133.453", "altitude": "30m"}' |
    sed 's/Location://' | jq .longitude
"133.453"

答案2

不幸的是,我没有足够的声誉来发表评论,但要扩展埃德·莫顿的答案:如果您jq使用该-r选项进行调用,当输出只是一个字符串时(就像您的情况一样),它会自动删除引号:

$ echo 'Location: {"date": "16/07/20", "time": "19:01:22", "latitude": "34.321", "longitude": "133.453", "altitude": "30m"}' | cut -d':' -f2- | jq -r .longitude
133.453

答案3

如果您想在没有jq(例如因为它不可用)的情况下尝试此操作,正如您的示例所暗示的,输出始终是一行,以下sed方法也适用:

sed -r 's/.*"longitude": "([^"]+)".*/\1/'

这会

  • 查找用双引号括起来的字符串("([^"]+)"即开始"后跟一个包含“anything but "”的字符串,直到结束"),其中括起来的内容定义为“捕获组” ( ... ),紧接在字符串之后"longitude":
  • 并将整行替换为捕获组 ( ) 的内容\1- 在您的情况下,是经度的实际值

测试:

~$ echo 'Location: {"date": "16/07/20", "time": "19:01:22", "latitude": "34.321", "longitude": "133.453", "altitude": "30m"}' | sed -r 's/.*"longitude": "([^"]+)".*/\1/'
133.453

答案4

如果你无法安装 jq,你可以在纯 bash 中使用循环过切来完成。

i=1
words=$(gps location)
word=$(echo $words | cut -d',' -f$i)
while ( [ -n "$word" ] )
  do
  echo $word | grep longitude | cut -d' ' -f2
  (( i+=1 ))
  word=$(echo $words | cut -d',' -f$i)
done

相关内容