2011-03-02 57 views
0

使用sed,我要搜索的字符串和替換,與其他中看到maven pom.xml如何忽略文本搜索中的換行符?

<groupId>com.abc</groupId> 
<version>3.1</version> 

<groupId>com.abc</groupId> 
<version>4.1</version> 

我寫

find . -name 'pom.xml' -type f -exec sed -i "s!"<groupId>com.abc</groupId>\n 
<version>3.1</version>"!"<groupId>com.abc</groupId>\n <version>4.1</version>!" '{}' \; 

但它永遠不會奏效!

+1

'sed'不是多行編輯的最佳工具。嘗試使用'perl'來代替。 – mouviciel 2011-03-02 15:56:40

回答

2

您需要使用N命令來讀取下一行。請參閱優秀的Sed and Awk書籍以獲取有關處理多行圖案空間的更多詳細信息。這有點費勁。

保存此sed命令將文件e.g cmd.txt

/<groupId>com.abc<\/groupId>/{ 
N 
s/<groupId>com.abc<\/groupId>\n<version>3.1<\/version>/<groupId>com.abc<\/groupId>\n<version>4.1<\/version>/ 
} 

然後運行:

$ sed -f cmd.txt pom.xml 
0

試試這個......希望它有幫助。

sed -e 's/3.1/4.1/g' pom.xml > pom1.xml 
+0

由於存在多個版本爲3.1的依賴項,因此無法使用此功能。需要搜索組ID以及 – Javabeginner 2011-03-02 16:07:50

+0

在這種情況下,您將不得不使用Perl作爲@mouviviel提到的具有多種模式的多行搜索。 – Rahul 2011-03-02 16:14:40

1

請勿爲此使用sed。 linebreaks是sed的一部分。這是xslt的工作。

下面的代碼片段被借用和調整從http://chrisdail.com/2009/05/17/changing-maven-pom-versions-with-groovy-and-xslt/

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="version[../groupId='com.abc']"> 
     <version>4.1</version> 
    </xsl:template> 
</xsl:stylesheet> 

只是做xsltproc的thisfile.xsl的pom.xml