2016-01-17 52 views
-2

我有一個文件pom.xml,它需要附加SNAPSHOT的版本。有時,SNAPSHOT丟失,導致構建失敗。我試圖用SNAPSHOT替換它,如果它不存在。如何在替換多行文本時第一次出現時停止

實際:

<artifactId>package1</artifactId> 
<version>1.0.0</version> 

期望:

<artifactId>package1</artifactId> 
<version>1.0.0-SNAPSHOT</version> 

由於artifactId不會是跨所有項目一樣,我試圖以搜索開始從</artifactId></version>模式並用添加到其中的SNAPSHOT文本替換它。這導致將文字替換爲pom.xml中可用的最後一個version

我已經試過如下:

cat pom.xml | sed ':a;N;$!ba;1,/<\/artifactId>/s/<\/artifactId><version>[0-9]*.[0-9]*.[0-9]*<\/version>/<\/artifactId><version>1.0.0-SNAPSHOT<\/version>/g' 

(不工作,因爲它是無法找到行的末尾)。

cat common-pom.xml | sed ':a;N;$!ba;0,/<\/artifactId>/s/<\/artifactId>.*<\/version>/<\/artifactId><version>0.0.0-SNAPSHOT<\/version>/g' 

(能夠做到的變化,但它替換的所有文本,直到在pom.xml可最後version)。

如何停止替換爲多行替換中的第一次出現?

+0

其實,讓你從只是讓上線換人以''? –

+0

由於pom.xml中有這麼多,只需要在一個地方完成替換,我無法替換所有這些文件。 –

+0

@ jonathan-lefflet,我確實經歷了你提到的問題。我趕上了需要明確處理的額外行。我無法完成。請重新考慮downvote,因爲我的問題與上面提到的略有不同。 –

回答

0

如果我理解正確的問題,這應該工作:

sed -r ' 
    /<artifactId>/ { 
     n 
     s/(([0-9]+\.){2}[0-9])(<\/version>)/\1-SNAPSHOT\3/ 
    } 
' infile 

您閱讀完整的文件到sed的替換與啓動前。這只是尋找與<artifactId>一行,讀下一行(n),並在那裏進行替換。

此外,您可以將文件作爲sed的參數進行處理,而不是使用cat來管道到sed。

這也適用於沒有-r,但所有括號和大括號將不得不逃脫。

示例文件:

<artifactId>package1</artifactId> 
<version>1.0.0</version>   <-- should get SNAPSHOT 
<artifactId>package1</artifactId> 
<version>1.0.0-SNAPSHOT</version> <-- already has SNAPSHOT 
Somethingelse 
<version>1.0.0</version>   <-- doesn't follow artifactId line 

結果

<artifactId>package1</artifactId> 
<version>1.0.0-SNAPSHOT</version> 
<artifactId>package1</artifactId> 
<version>1.0.0-SNAPSHOT</version> 
Somethingelse 
<version>1.0.0</version> 
+0

謝謝,給出的解決方案工作 –

相關問題