1

任何人都可以根据以下文本帮助我 sed 获取时间、纬度和经度的值

{"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}
4

4 回答 4

1
$ grep -oP '"lat":\K[\d.]+' file
$ grep -oP '"lon":\K[\d.]+' file
$ grep -oP '"time":"\K[^"]+' file
于 2012-10-02T10:54:18.787 回答
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
于 2012-10-02T13:14:32.993 回答
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”命令将此保持空间的内容附加到模式空间(即工作缓冲区)中来做到这一点,两次。现在我们有该行的三个副本。

为简单起见,为了更通用,有三个单独的命令来提取数据,但格式类似:

  1. 跳过一些字符,直到我们找到我们的密钥。请注意,我们必须在前两个命令中跳过不是换行符 ( [^\n]*) 的字符,否则它们会由于其贪婪行为而影响它们下面的行(即,如果在找到之前尽可能多地跳过字符"lat",您将跳过前两行,因为第三行也包含"lat")。在最后一个命令中,您可以跳过任何字符 ( .*),但您必须首先跳过一个换行符以防止它与前面的行匹配。
  2. 跳过钥匙
  3. 跳过零个或多个空白字符 ( \s*)
  4. 跳过冒号
  5. 跳过更多可选的空白字符
  6. 捕获数据。捕获由反斜杠括号指定(即the\(和被称为,第三个,依此类推直到)。在前两个命令中,我们匹配一系列数字或句点 ( )。在最后一个命令中,我们捕获任何不是双引号 ( ) 的字符,但我们也在捕获组之后的一个双引号之前跳过双引号(即,跳过开始和结束双引号)。\)\1\2\3\9[0-9.]*[^"]*"
  7. 跳过更多字符。我们尽可能多地跳过不是换行符的字符,因此我们有效地跳到了行尾。

最后,在每个命令中,我们将匹配项替换为捕获结果。在最后一个命令中,由于我们匹配并因此跳过分隔第二行和第三行的换行符,因此我们必须将其包含在替换中。要包含它,我们必须在其后添加一个反斜杠和一个实际的换行符。这就是为什么替换被分成两行的原因。

希望这会有所帮助=)

于 2012-10-02T12:02:42.247 回答
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
于 2012-10-02T12:02:52.360 回答