任何人都可以帮助我根据下面的文字获取时间,纬度和经度的值
{"class":"TPV","tag":"MID2","device":"/dev/ttyUSB0","mode":3,"time":"2012-10-02T10:43:21.000Z","ept":0.005,"lat":55.190682291,"lon":25.265912847,"alt":19.149,"epx":58.300,"epy":74.796,"epv":144.575,"track":148.2723,"speed":1.623,"climb":-1.471,"eps":149.59}
答案 0 :(得分:1)
$ grep -oP '"lat":\K[\d.]+' file
$ grep -oP '"lon":\K[\d.]+' file
$ grep -oP '"time":"\K[^"]+' file
答案 1 :(得分:1)
使用egrep和sed
<infile egrep -o '"(lat|lon|time)":"?[^,]*' | sed 's/[^:]*://'
输出:
"2012-10-02T10:43:21.000Z"
55.190682291
25.265912847
如果您不喜欢双引号,请将tr -d '"'
附加到管道。
单独使用sed
<infile sed -r 's/"(lat|lon|time)":"?([^,"]*)/\n\2\n/g' | sed -n '2~2p'
输出:
2012-10-02T10:43:21.000Z
55.190682291
25.265912847
第一个sed将匹配分开,所以它们将在每一行上分开,第二个选择它们。
使用tr和grep
<infile tr ',' '\n' | grep 'time\|lon\|lat'
输出:
"time":"2012-10-02T10:43:21.000Z"
"lat":55.190682291
"lon":25.265912847
答案 2 :(得分:0)
我会这样做(作为sed脚本):
#!/bin/sed -f
h;G;G
s/[^\n]*"lat"\s*:\s*\([0-9.]*\)[^\n]*/\1/
s/[^\n]*"lon"\s*:\s*\([0-9.]*\)[^\n]*/\1/
s/\n[^\n]*"time"\s*:\s*"\([^"]*\)".*$/\
\1/
第一行三个命令(h;G;G
)复制该行两次。它通过使用“h”命令将输入行复制到辅助缓冲区(称为保持空间),然后使用“G”命令将此保留空间的内容附加到模式空间(即工作缓冲区)中来完成此操作,两次。现在我们有三行副本。
为简单起见,为了更加通用,有三个单独的命令来提取数据,但格式类似:
[^\n]*
)的字符,否则它们会影响它们下方的行,因为它的贪婪行为(即,如果跳过与你一样多的字符)在找到"lat"
之前,您将跳过前两行,因为第三行还包含"lat"
)。在最后一个命令中,您可以跳过任何字符(.*
),但必须先跳过换行符以防止它与前面的行匹配。\s*
)\(
和\)
)指定,它将把括号中的表达式匹配的输入存储到名为{{1}的辅助“变量”中(如果您有多个捕获组,则第二个将被称为\1
,第三个将被称为\2
,依此类推,直至\3
)。在前两个命令中,我们匹配一系列数字或句点(\9
)。在最后一个命令中,我们捕获任何不是双引号([0-9.]*
)的字符,但我们也在捕获组之后的一个字符之前跳过双引号(即跳过打开和关闭双引号)。 最后,在每个命令中,我们将匹配替换为捕获结果。在最后一个命令中,由于我们匹配并因此跳过分隔第二行和第三行的换行符,因此我们必须将其包含在替换中。要包含它,我们必须在其后添加反斜杠和实际的换行符。这就是为什么替换分为两行。
希望这有助于=)
答案 3 :(得分:0)
对于GNU awk
:
awk -F, '{ for (i=1; i<=NF; i++) if ($i ~ /time|lat|lon/) { match($i, /^\"([^\"]+)\":\"?([^\"]+)\"?/, array); printf "%s: %s\n", array[1], array[2] } }' file.txt
结果:
time: 2012-10-02T10:43:21.000Z
lat: 55.190682291
lon: 25.265912847