使用shell脚本

时间:2015-10-23 04:25:43

标签: xml bash

我有一个示例xml文件,如下所示

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <weekly-schedule>
        <week>
            <game date="2015-09-10 17:30 PDT" start="Friday">
                <outcome outcome="pregame"/>
                <id>SP003188020000</id>
            </game>
            <game date="2015-09-13 10:00 PDT" start="Sunday">
                <outcome outcome="pregame"/>
                <id>SP003188030000</id>
            </game>
            <game date="2015-09-13 10:00 PDT" start="Monday">
                <outcome outcome="pregame"/>
                <id>SP003188030000</id>
            </game>
       </week>
  </weekly-schedule>
</root>

我想删除这个xml中的所有游戏节点,这些节点是start =&#34; Monday&#34;并开始=&#34;星期五&#34; 然后我想更新xml文件,而不是上面的游戏。我怎样才能做到这一点?

下面是我的脚本(可以是bash),我想在不使用xmlstarlet的情况下执行此操作。

#!/bin/sh
DIR=/users/Desktop/data
FILE=games.xml
cd $DIR

# tried to use xmllint 
DAY=$(echo "cat //root/weekly-schedule/week/game/@start" | xmllint --shell $FILE )
echo DAY

1 个答案:

答案 0 :(得分:0)

你可以使用这个单行awk命令:

awk '/<game.*start="(Friday|Monday)">/{skip=1;} 1{if(!skip)print;} /<\/game>/{skip=0}' myfile.xml > newfile.xml && mv newfile.xml myfile.xml

它的工作方式如下:

  • 第一个模式匹配我们愿意删除的行的开头,并设置变量skip
  • 最后一个模式匹配我们愿意删除的行的结尾,并取消设置变量skip
  • 我们使用skip标志有条件地输出行,之后我们可能会重置skip