2012-05-25 26 views
0

我正在尋找一個比通常的查找/替換通過sed稍微複雜的東西寫一個bash腳本。我有一本名爲bash Cookbook的書,我一直試圖從中收集一些靈感,但我並沒有走得太遠。Bash腳本從一行復制並用副本替換另一行

基本上我試圖編寫一個腳本來自動更新一堆maven pom.xml文件中的版本號。下面是我在看的一般設置:

<!-- TEMPLATE:BEGIN 
    <version>@@[email protected]@</version> 
--> 
    <version>1.0.0</version> 
<!-- TEMPLATE:END --> 

運行腳本(使用新的版本號1.0.1)後,我想該文件,而不是閱讀:

<!-- TEMPLATE:BEGIN 
    <version>@@[email protected]@</version> 
--> 
    <version>1.0.1</version> 
<!-- TEMPLATE:END --> 

所以這將在實際發佈pom文件中,1.0.0是當前版本(我試圖用1.0.1或其他版本替換它)。顯然,版本號將會改變,所以沒有一個好的方法來做一個查找/替換(因爲你想找的東西是可變的)。我希望能夠寫一個bash腳本可以

  1. 與實際的版本號
  2. 取代@@ VERSION @@刪除當前版本線
  3. 寫就行了更新版本前行模板:END(?而在文件中保存@@ VERSION @@ - 可能借模板出來到一個臨時文件,做更換,然後再做到這一點)

我可以排序做的其中一些(寫出一個新的文件,做repl acement)使用Ant腳本一拉
<replace file="pom.xml">
<replacefilter token="@@[email protected]@" value="${version}"/>
</replace>

但我不知道是什麼方式的最佳途徑。)與舊版本或b。刪除線)告訴它的新行復制在正確的位置是。任何人都知道如何做到這一點或有任何建議?

+0

什麼是你想要的輸出看?你的描述有些模棱兩可。 –

+0

(a)使用您的VCS替代這些(b)XSL(c)利潤 – sehe

+0

爲清晰起見編輯。 – matt5784

回答

3

假設新的版本號是一個shell變量$VERSION,那麼你應該能夠使用:

sed -e '/<!-- TEMPLATE:BEGIN/,/<!-- TEMPLATE:END -->/{ 
     s/<version>[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*<\/version>/<version>'$VERSION'<\/version>/ 
     }' 

注意,這忽略與@@[email protected]@模板版本線,但僅匹配由三部分組成的版本在包含TEMPLATE:BEGIN和TEMPLATE:END的行之間出現的數字,只剩下其他所有內容(包括其他行包含<version>...</version>元素)。

你可以決定怎麼做文件覆蓋(也許你的sed版本是GNU和它自動在與-i選項的要求),等等。你也許還可以使用,導致更強大的正則表達式符號到更緊湊的比賽。但是,這應該適用於sed的大多數版本而無需更改。

1

您列出的步驟(1-3)的讀法就好像您實際上並不在意根據註釋中定義的模板化規則執行替換。

因此,這裏是一些代碼爲您介紹了,其行爲冗長:

#!/bin/bash 

file=$1 
newversion=$2 

sed -i $file -e "s|<version>\([^@]*\)</version>|<version>$newversion</version>|" 

運行:

chmod +x yourscript.sh 
./yourscript.sh filetoupdate.xml 1.0.1 
+0

這對' ...''標記會出現TEMPLATE:END? –

0
use 5.010; 
use strictures; 
use Perl::Version qw(); 
use XML::LibXML qw(); 

my $dom = XML::LibXML->load_xml(location => 'pox.xml'); 

for my $node ($dom->findnodes('//version')) { 
    my $version = Perl::Version->new($node->textContent); 
    $version->inc_subversion; 
    $version->stringify; 
    $node->removeChildNodes; 
    $node->appendText($version); 
}; 

say $dom->toString; 
+1

這會對' ...'標記做什麼?TEMPLATE:END後出現? –

+0

它會修改它。 – daxim

相關問題