2017-02-19 34 views
0

我有一個文件channels.xml像這樣的一個結構,閱讀,長4000線做一個sh文件從一個XML文件

<!--begin_channel--> 
Rai 1.png 
<!--end_channel--> 
Rai 1 +2HD.png 
Rai 1 +1HD.png 
<!--begin_channel--> 
Rai 2.png 
<!--end_channel--> 
Rai 2 +2HD.png 
Rai 2 +1HD.png 
. 
. 

我需要做一個文件channels.sh這樣的:

cp /cygdrive/c/ProgramData/ServerCare/data/picons/Rai_1.png /cygdrive/c/ProgramData/ServerCare/data/picons/duplicati/Rai_1_+2HD.png 
cp /cygdrive/c/ProgramData/ServerCare/data/picons/Rai_1.png /cygdrive/c/ProgramData/ServerCare/data/picons/duplicati/Rai_1_+1HD.png 
cp /cygdrive/c/ProgramData/ServerCare/data/picons/Rai_2.png /cygdrive/c/ProgramData/ServerCare/data/picons/duplicati/Rai_2_+2HD.png 
cp /cygdrive/c/ProgramData/ServerCare/data/picons/Rai_2.png /cygdrive/c/ProgramData/ServerCare/data/picons/duplicati/Rai_2_+1HD.png 

我需要用cygwin來做,我有一個腳本可以在ubuntu下做到,但是cygwin無法正常工作。這是腳本:

#!/bin/bash 

#colori 
RED='\033[0;31m' 
GREEN='\033[0;32m' 
NC='\033[0m' 

if [ $# -ne 4 ] 
then 
    echo -e "${RED}ERRORE${NC}, inserire $0 filein fileout pathlogo_from pathlogo_to" 
    echo -e "${RED}Ricorda${NC} le enstensioni!" 
    exit 0 
fi 

if [ -f $2 ] 
then 
    echo -n -e "File $2 esistente, vuoi ${RED}sovrascrivere${NC}?(Y/n) " 
    read scelta 
    if [ $scelta != 'Y' ] 
    then 
     exit 0 
    else 
     rm $2 
    fi 
fi 
awk '/\<!--begin_channel--\>/{flag=1; next} /\<!--end_channel--\>/{flag=0} flag' $1 > temp 

while read line 
do 
    awk "/$line/,/<!--begin_channel-->/ " $1 | grep -v "$line" | grep -v "^<" > tmp 
     for channel in `cat tmp` 
     do 
      channel=`echo $channel | tr ")" "_" | tr "(" "_" | tr ":" "_"` 
      echo "cp $3/$line $4/$channel" 
     done 

done <temp >> $2 
rm temp 
rm tmp 
echo -e "${GREEN}File $2 creato correttamente${NC}" 

我認爲錯誤是關於這條線

awk "/$line/,/<!--begin_channel-->/ " $1 | grep -v "$line" | grep -v "^<" > tmp 

要運行它,我用命令

{ bash } »./script.sh channels.xml channels.sh /cygdrive/c/ProgramData/ServerCare/data/picons/ /cygdrive/c/ProgramData/ServerCare/data/picons/duplicati/ 

有人可以幫我解決這個問題或寫一個新的?

+0

請解釋什麼,「但Cygwin的不工作」,意味着什麼?有錯誤消息嗎?我的第一個想法是,你正在使用錯誤的工具,因爲你應該使用的東西,可以讀取XML文件,如xmllint – grail

+0

該腳本看起來像運行,但最終我收回一個錯誤,如「我不能刪除tmp文件找不到「,我可以找到文件channels.sh但是是空的。看起來像cygwin不喜歡第二個命令awk。該腳本在ubuntu下運行,並且我不知道該版本安裝在cygwin中。也許只是關於命令構造的一個小錯誤。 – Tapiocapioca

回答

0

@Tapiocapioca:嘗試:您可以根據您的需求將輸出轉換爲文件或腳本,然後讓我們知道。

awk -vlines=$(cat Input_file | wc -l) -vsource="/cygdrive/c/ProgramData/ServerCare/data/picons/" -vtarget="/cygdrive/c/ProgramData/ServerCare/data/picons/duplicati/" '/<!--end_channel/{getline;while($0 !~ /<!--begin_channel/){print "cp " source SOURCE OFS target $0;if(NR==lines){exit};getline}} /<!--begin_channel/{getline;SOURCE=$0;next}' Input_file 

NON-一個的解決方案班輪形式如下太:

awk -vlines=$(cat Input_file | wc -l) -vsource="/cygdrive/c/ProgramData/ServerCare/data/picons/" -vtarget="/cygdrive/c/ProgramData/ServerCare/data/picons/duplicati/" ' 
     /<!--end_channel/{ 
           getline; 
           while($0 !~ /<!--begin_channel/){ 
                       print "cp " source SOURCE OFS target $0; 
                       if(NR==lines){ 
                           exit 
                          }; 
                       getline 
                      } 
         } 
     /<!--begin_channel/{ 
           getline; 
           SOURCE=$0; 
           next 
          } 
                                            ' Input_file 
+0

我收到了錯誤「貓:file333:沒有這樣的文件或目錄」 – Tapiocapioca

+0

@Tapiocapioca:我很抱歉,這是非常初步的答案,我的Input_file是file333,現在我已經將它們更改爲Input_file。在代碼的兩個地方嘗試使用實際的Input_file名稱,然後讓我知道它是如何實現的。 – RavinderSingh13

+0

完美!真的非常感謝你的幫助,如果你有一天會在印度尼西亞買一瓶啤酒;) Ps。如果我也想替換|有一個空間,我可以用你的命令嗎? – Tapiocapioca

0

雖然我不是蠻力粉絲,這裏有一些選擇:

awk -vsource="/cygdrive/c/ProgramData/ServerCare/data/picons/" 
    -vtarget="/cygdrive/c/ProgramData/ServerCare/data/picons/duplicati/" 
    '/begin_channel/{getline src;gsub(/ /,"_",src)} 
    /end_channel/{for(i=1;i<3;i++){ 
     getline dest;gsub(/ /,"_",dest); 
     print "cp",source src,target dest}}' xml_file 

現在很好關於上述內容的是,一旦你滿意輸出是正確的,你可以簡單地在打印和「cp」之間放置一個管道(|),它會將輸出傳遞給shell,並使複製發生,或者如果你真的需要做一箇中途ediate腳本出於某種原因,離開管出來,只需將AWK重定向到channels.sh

這裏有一個bash替代太:

xml="$1" 
script="$2" 
src_path="$3"  
dest_path="${src_path}duplicati/"  

get_src=0  
get_dest=0  

while read -r line  
do  
    if [[ "$line" =~ begin_channel ]]  
    then  
    get_src=1  
    get_dest=0  
    elif [[ "$line" =~ end_channel ]]  
    then  
    get_dest=1  
    get_src=0  
    else  
    ((get_src == 1)) && src="${src_path}${line// /_}"  

    if ((get_dest == 1))  
    then  
     dest="${dest_path}${line// /_}"  
     echo "cp $src $dest"  
    fi  
    fi  
done<"$xml">"$script" 
+0

真的很感謝你! :D:D – Tapiocapioca