2017-02-19 71 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