UNIX中的字符串搜索

时间:2013-11-22 07:05:24

标签: shell unix

我有一个xml文件,其内容类似于以下内容:

<tag>
    <sub>...</sub>
    <msg>....</msg>
</tag>
<tag>
    <sub>...</sub>
</tag>
<tag>
    <sub>...</sub>
    <msg>....</msg>
</tag>
<tag>
    <sub>...</sub>
</tag>
<tag>
    <sub>...</sub>
    <msg>....</msg>
</tag>
<tag>
    <sub>...</sub>
</tag>

我需要一个shell脚本来浏览整个xml文件并在每个<tag>...</tag>内执行搜索。如果<tag>存在,则在每个<msg>内执行操作1,如果<msg>不存在则执行操作2.如何执行此操作?

2 个答案:

答案 0 :(得分:0)

这听起来像是XSLT

的工作

鉴于此test.xml:

<document>
<tag n="1">
    <sub>...</sub>
    <msg>....</msg>
</tag>
<tag n="2">
    <sub>...</sub>
</tag>
<tag n="3">
    <sub>...</sub>
    <msg>....</msg>
</tag>
<tag n="4">
    <sub>...</sub>
</tag>
<tag n="5">
    <sub>...</sub>
    <msg>....</msg>
</tag>
<tag n="6">
    <sub>...</sub>
</tag>
</document>

以下是一些xpath表达式的示例

  • “tag”标签,其中包含“msg”子级

    $ xmlstarlet sel -t -v '//tag[msg]/@n' test.xml 
    1
    3
    5
    
  • 没有“msg”孩子的“tag”标签

    $ xmlstarlet sel -t -v '//tag[not(msg)]/@n' test.xml 
    2
    4
    6
    

答案 1 :(得分:0)

cat tagfile|awk 'BEGIN{ORS=" ";} {print;}'|sed 's@</tag>@&\n@g'>tempfile

while read line
do
echo $line|grep -i "<msg>">/dev/null
if [ $? -eq 0 ] then
Action1
else
Action2
fi
done<tempfile