0

在为我的问题寻找了很多解决方案之后,我终于必须问它并尝试得到一些很好的答案

所以,我有一个喜欢的xml文件

< trigger name="ECUReset" value="0x11">
...
< /trigger>
< trigger name="ClearDTC" value="0x14">
...
< /trigger>

我想用 shell 脚本解析它并检索trigger name它,它value在一个关联数组中,或者接近perl hashes

我在机器上可用的工具只有grepsed,我没有perlawk

我现在设法得到的是

trigger_name=$(sed -n '/trigger_name=/ s/[^\x22]*\x22\(\x22*\)//p' $FILENAME)

但这并没有返回我想要的

我不能使用 perl,但我肯定会喜欢,因为我是 perl 开发人员,也没有 awk 或其他东西,只是带有 sed 和 grep 的 shell。

4

4 回答 4

0

如果您有该cut实用程序:

$ grep "< trigger" test.xml \
> | cut --delimiter=" " --fields=3,4 \
> | cut --delimiter='"' --fields=2,4 --output-delimiter=" : "
ECUReset : 0x11
ClearDTC : 0x14
于 2013-01-22T10:20:09.130 回答
0

does this work for you? (just with sed)

sed -rn '/trigger name/{s/.*trigger name="([^"]*)" value="([^"]*)".*$/\1=\2/g;p}' file

test

kent$  echo '< trigger name="ECUReset" value="0x11">
...
< /trigger>
< trigger name="ClearDTC" value="0x14">
...
< /trigger>'|sed -rn '/trigger name/{s/.*trigger name="([^"]*)" value="([^"]*)".*$/\1=\2/g;p}'                                                                              
ECUReset=0x11
ClearDTC=0x14
于 2013-01-22T10:23:08.960 回答
0
grep 'trigger name' your_file| cut -d'"' -f 2,4|sed 's/\"/ /g'

测试:

>cat temp
< trigger name="ECUReset" value="0x11">
...
< /trigger>
< trigger name="ClearDTC" value="0x14">
...
< /trigger>
> grep 'trigger name' temp | cut -d'"' -f 2,4 | sed 's/\"/ /g'
ECUReset 0x11
ClearDTC 0x14
于 2013-01-22T10:26:49.347 回答
0

只需使用sed

# names
$ sed -n 's/< trigger name="\([^"]*\).*/\1/p' file
ECUReset
ClearDTC

# values
$ sed -n 's/< trigger.*value="\([^"]*\).*/\1/p' file
0x11
0x14

# both
$ sed -n 's/.*< trigger name="\([^"]*\).*value="\([^"]*\).*/\1 \2/p' file
ECUReset 0x11
ClearDTC 0x14
于 2013-01-22T10:30:04.583 回答