grep,xml问题 @ubuntu:/tmp$cat one.xml 12.10分贝 75% 0 99% @ubuntu:/tmp$sed-n-e's/*\([0-9][0-9]*\)./\1/p'one.xml @ubuntu:/tmp$
我想得到中间值。但是它不起作用,我做错了什么?用正则表达式处理xml不是一个很好的主意,您可能需要研究像xmlstarlet这样的命令行工具来进行此提取grep,xml问题 @ubuntu:/tmp$cat one.xml 12.10分贝 75% 0 99% @ubuntu:/tmp$sed-n-e's/*\([0-9][0-9]*\)./\1/p'one.xml @ubuntu:/tmp$,xml,linux,grep,Xml,Linux,Grep,我想得到中间值。但是它不起作用,我做错了什么?用正则表达式处理xml不是一个很好的主意,您可能需要研究像xmlstarlet这样的命令行工具来进行此提取 @ubuntu:/tmp$ cat one.xml <?xml version="1.0" encoding="UTF-8"?> <e2frontendstatus> <e2snrdb> 12.10 dB </e2snrdb> <e
@ubuntu:/tmp$ cat one.xml
<?xml version="1.0" encoding="UTF-8"?>
<e2frontendstatus>
<e2snrdb>
12.10 dB
</e2snrdb>
<e2snr>
75 %
</e2snr>
<e2ber>
0
</e2ber>
<e2acg>
99 %
</e2acg>
</e2frontendstatus>
@ubuntu:/tmp$ sed -n -e 's/.*<e2ber>\([0-9][0-9]*\)<\/e2ber>.*/\1/p' one.xml
@ubuntu:/tmp$
使用正则表达式处理xml不是一个很好的主意,您可能需要研究像xmlstarlet这样的命令行工具来完成此提取
@ubuntu:/tmp$ cat one.xml
<?xml version="1.0" encoding="UTF-8"?>
<e2frontendstatus>
<e2snrdb>
12.10 dB
</e2snrdb>
<e2snr>
75 %
</e2snr>
<e2ber>
0
</e2ber>
<e2acg>
99 %
</e2acg>
</e2frontendstatus>
@ubuntu:/tmp$ sed -n -e 's/.*<e2ber>\([0-9][0-9]*\)<\/e2ber>.*/\1/p' one.xml
@ubuntu:/tmp$
你在寻找什么价值?您知道Linux的grep有一个“After-context”和“Before-context”命令行参数吗?这可能是获取您正在查找的信息的最简单方法 例如,如果您试图获取行后的值,可以执行以下操作:
xmlstarlet sel -t -v "//e2ber" one.xml
$grep-A1”“| tail-1
您在寻找什么价值?您知道Linux的grep有一个“After-context”和“Before-context”命令行参数吗?这可能是获取您正在查找的信息的最简单方法
例如,如果您试图获取行后的值,可以执行以下操作:
xmlstarlet sel -t -v "//e2ber" one.xml
$grep-A1”“| tail-1
如果您有上述答案中提到的grep-A
选项,并且系统上有Unix命令tr
,您可以使某些东西相当健壮
此命令应获得适当的值:
$ grep -A1 "<e2ber>" | tail -1
grep-A2''one.xml |\
tr-d'\n'|\
sed-n-E-E的/*[:blank:][]*([0-9][0-9]*)[[:blank:][]*./\1/p'
无论XML文件的格式是否为0
或作为
0
grep将获取足够多的行以包含结束标记,tr将使这一行变长,sed将提取值。我已经更新了sed中的正则表达式,以忽略值周围的空格
如果XML文件是双倍行距的,这可能仍然会有问题
<e2ber>
0
</e2ber>
0
您可以事先通过
tr-s'\n'
运行XML文件来解决这个问题。这将把多个换行压缩成一个换行。如果您有上面答案中提到的grep-a
选项,并且在您的系统上使用Unix命令tr
,您可以使某些功能相当健壮
此命令应获得适当的值:
$ grep -A1 "<e2ber>" | tail -1
grep-A2''one.xml |\
tr-d'\n'|\
sed-n-E-E的/*[:blank:][]*([0-9][0-9]*)[[:blank:][]*./\1/p'
无论XML文件的格式是否为0
或作为
0
grep将获取足够多的行以包含结束标记,tr将使这一行变长,sed将提取值。我已经更新了sed中的正则表达式,以忽略值周围的空格
如果XML文件是双倍行距的,这可能仍然会有问题
<e2ber>
0
</e2ber>
0
您可以事先通过
tr-s'\n'
运行XML文件来解决这个问题。这将把多个换行压缩成一个换行。谢谢您的回答,但是我在嵌入式系统(卫星接收器)上运行了这个小命令,在嵌入式系统中无法运行xmlstarlet(这是一个非常好的工具):/。所有其他linux命令都可用,grep,sed..谢谢你的回答,但是我在嵌入式系统(卫星接收器)上运行这个小命令,在那里无法运行xmlstarlet(这是一个非常好的工具):/。所有其他linux命令都可用,grep,sed..它不起作用,因为你有换行符在那里。。。我敢肯定,这在sed或awk中是可行的,但在perl中可能会更快乐。。。问题是sed一次只对一行应用正则表达式。由于和位于不同的行上,因此表达式不匹配它们。你能把文件格式改成这样吗?这样你就可以更容易地识别线路。我们应该问的另一个问题是你的确切要求。我知道您的资源有限,因此无法完全解析XML,因此您的健壮性将受到限制。我希望,您至少可以指望XML文件不会做任何太疯狂的事情。因此,这是一个linux卫星接收器,我想在它上运行我的“每小时将信号强度保存到cvs文件”脚本。信号统计数据来自webinterface(ip/web/one.xml)。文件格式是固定的,我不能更改。它不工作,因为你有新行在那里。。。我敢肯定,这在sed或awk中是可行的,但在perl中可能会更快乐。。。问题是sed一次只对一行应用正则表达式。由于和位于不同的行上,因此表达式不匹配它们。你能把文件格式改成这样吗?这样你就可以更容易地识别线路。我们应该问的另一个问题是你的确切要求。我知道您的资源有限,因此无法完全解析XML,因此您的健壮性将受到限制。我希望,您至少可以指望XML文件不会做任何太疯狂的事情。因此,这是一个linux卫星接收器,我想在它上运行我的“每小时将信号强度保存到cvs文件”脚本。信号统计数据来自webinterface(ip/web/one.xml)。文件格式已修复,我无法更改。