2015-10-23 164 views
0

我有一个像下面使用shell脚本

<?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这是开始=“星期一”,并开始=所有的游戏节点示例XML文件中删除特定的XML节点“星期五” 然后我想更新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 

回答

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
+0

这对我来说这'awk'命令没有工作是我的shell脚本。 '#!/ bin/sh DIR =/users/Desktop/data FILE = games.xml cd $ DIR awk'//{skip=1 ;} 1 {if(!skip)print;}/<\/game>/{skip = 0}'games.xml> newfile.xml && mv newfile.xml games.xml' – Neero

+0

我有多个节点,其中start =“Thursday”并开始=“星期一”是否这是不起作用的原因? – Neero

+0

@Jotne你有什么建议吗?谢谢 – Neero