2012-06-21 25 views
0

我有以下內容的文件的test.xml:猛砸,grep的,sed的...:具有多文件內容替換方面

<body> 
<content> 
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed non risus. Suspendisse lectus tortor, dignissim sit amet, adipiscing nec, ultricies sed, dolor. Cras elementum ultrices diam.</p><p>Maecenas ligula massa, varius a, semper congue, euismod non, mi. Proin porttitor, orci nec nonummy molestie, enim est eleifend mi,..</p><p> 
<MEDIAREF localid="HTM37c2ae34-b92c-11e1-86ab-e6b6e8e434a7-0"/> 
</p><p>Duis arcu massa, scelerisque vitae, consequat in, pretium a, enim. Pellentesque congue. Ut in risus volutpat libero pharetra tempor. Cras vestibulum bibendum augue</p><p> 
<MEDIAREF localid="HTM37c2ae34-b92c-11e1-86ab-e6b6e8e434a7-1"/> 
</p><p>Praesent egestas leo in pede. Praesent blandit odio eu enim. 
</p> 
</content> 
</body> 
... 
<ZONEMEDIAS> 
<MEDIA localid="HTM37c2ae34-b92c-11e1-86ab-e6b6e8e434a7-0"> 
<MEDIAPROPRIETES> 
<PROPRIETE value="HTM" name="type"/> 
</MEDIAPROPRIETES> 
<CODEMEDIA>&lt;object width="493" height="370"&gt;&lt;param name="movie" value="http://www.youtube.com/v/Rxxxxxfr_FR&amp;amp;rel=0"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/RxxxxxfrR&amp;amp;rel=0" type="application/x-shockwave-flash" width="493" height="370" allowscriptaccess="always" allowfullscreen="true"&gt;&lt;/embed&gt;&lt;/object&gt; 
</CODEMEDIA> 
</MEDIA><MEDIA localid="HTM37c2ae34-b92c-11e1-86ab-e6b6e8e434a7-1"> 
<MEDIAPROPRIETES> 
<PROPRIETE value="HTM" name="type"/> 
</MEDIAPROPRIETES> 
<CODEMEDIA>&lt;blockquote class="twitter-tweet" lang="fr"&gt;&lt;p&gt;second texte to replace &lt;a href="https://twitter.com/xxxx" data-datetime="2012-06-15T01:12:03+00:00"&gt;Juin 15, 2012&lt;/a&gt;&lt;/blockquote&gt; 
&lt;script src="//platform.twitter.com/widgets.js" charset="utf-8"&gt;&lt;/script&gt; 
</CODEMEDIA> 
</MEDIA> 
</ZONEMEDIAS> 

我預計

更換

<MEDIAREF localid="HTM37c2ae34-b92c-11e1-86ab-e6b6e8e434a7-0"/> 

&lt;object width="493" height="370"&gt;&lt;param name="movie" value="http://www.youtube.com/v/Rxxxxxfr_FR&amp;amp;rel=0"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/RxxxxxfrR&amp;amp;rel=0" type="application/x-shockwave-flash" width="493" height="370" allowscriptaccess="always" allowfullscreen="true"&gt;&lt;/embed&gt;&lt;/object&gt; 

,做同樣爲::

有沒有什麼辦法可以在bash中實現這一點?

我想是這樣的,如果LOCALID

grep "<MEDIAREF localid=.*\".>" test.xml | sed -e "s/^.*<MEDIAREF localid=/<MEDIAREF localid=/" | cut -f2 -d"\"" | cut -f1 -d"\"" 

檢索的價值,但我不知道如何更換後

有人能幫助我嗎?

回答

1

在bash

while read line;do 
    if [[ $line =~ 'MEDIAREF localid="HTM37c2ae34-b92c-11e1-86ab-e6b6e8e434a7-0"' ]];then 
    echo '&lt;object width="493" height="370"&gt;&lt;param name="movie" value="http://www.youtube.com/v/Rxxxxxfr_FR&amp;amp;rel=0"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/RxxxxxfrR&amp;amp;rel=0" type="application/x-shockwave-flash" width="493" height="370" allowscriptaccess="always" allowfullscreen="true"&gt;&lt;/embed&gt;&lt;/object&gt;'; 
    else 
    echo "$line"; 
    fi; 
done <test.xml> new-test.xml 

編輯,您的評論後,我更好地瞭解你想要做什麼時,bash是不是最好的解決方案,可能不是安全的,Perl是好,但它與你的榜樣工程。這裏使用bash的解決方案:

#!/bin/bash 
# First loop to set variables ${!HTM*} 
localid=""   # localid property 
codemedia=0  # flag to indicate between CODEMEDIA tags 
cm_content=""  # CODEMEDIA content 
while IFS=\< read -d \> content tag;do 
    if((codemedia==1));then 
     cm_content="$cm_content$content" 
    fi 
    # set the flag or localid property 
    if [[ "$tag" =~ ^CODEMEDIA.* ]];then 
     codemedia=1 
    elif [[ "$tag" =~ ^/CODEMEDIA ]];then 
     codemedia=0 
     eval "$localid=\"${cm_content//\"/\\\"}\"" 
     cm_content="" 
    elif [[ "$tag" =~ ^MEDIA\ ]];then 
     lf=0 
     while read -d \" lprop;do 
      if((lf==1));then 
       localid=${lprop//-/_} 
       break 
      fi 
      if [[ "$lprop" =~ localid=$ ]];then 
       lf=1 
      fi 
     done <<<$tag 
    fi 
done < test.xml 
echo ${!HTM*} 
# Second loop to replace MEDIAREF tag 
{ while IFS=\< read -d \> content tag;do 
    if [[ "$tag" =~ ^MEDIAREF.*/$ ]];then 
     lf=0 
     while read -d \" lprop;do 
      if((lf==1));then 
       localid=${lprop//-/_} 
       break 
      fi 
      if [[ "$lprop" =~ localid=$ ]];then 
       lf=1 
      fi 
     done <<<$tag 
     echo -n "$content${!localid}" 
    else 
     echo -n "$content<$tag>" 
    fi 
done;echo;} <test.xml> new-test.xml 

在Perl的其他解決方案:

#!/usr/bin/perl 
use strict; 
use warnings; 

my $inputFile=$ARGV[0]||"test.xml"; 
my %hash; 
open(INPUT,"<$inputFile") or die "cannot open $inputFile for readding"; 
# reads whole file in $_ (see perlvar) 
# other solution if file is too long is to set $/="</MEDIA>"; for example and to change the while loop 
$_=join("",<INPUT>); 
# for gms flags (see perlre) 
while(m{<MEDIA localid="(.*?)".*?<CODEMEDIA>(.*?)</CODEMEDIA>.*?</MEDIA>}gms){ 
    $hash{$1}=$2; 
} 
close(INPUT); 
open(INPUT,"<$inputFile") or die "cannot open $inputFile for readding"; 
# again reads whole file 
$_=join("",<INPUT>); 
s{<MEDIAREF localid="(.*?)".*?/>}{$hash{$1}}gms; 
close(INPUT); 
# print on STDOUT 
# other solution open(OUTPUT,">filename"); print OUTPUT $_; close(OUTPUT); 
print; 
+0

嗨, 我要的是閱讀文件,如果mediaref成立,使該腳本將搜索同一媒體id並用媒體對應的媒體代替媒體參數 – mike

+0

嗨, 感謝您的回答。我嘗試了bash解決方案,但出現了一個錯誤:語法錯誤:意外重定向(已完成<<< $ tag)。 – mike

+0

Re, 這是工作。問題是Ubuntu中的默認系統shell是破折號而不是bash。非常感謝你。 – mike