2015-10-23 160 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