如何在文本搜索中忽略换行符?

时间:2011-03-02 15:40:34

标签: xml maven sed replace

使用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>!" '{}' \; 

但它永远不会奏效!

3 个答案:

答案 0 :(得分:2)

您需要使用N命令来阅读下一行。有关处理多行模式空间的更多详细信息,请查看优秀的Sed and Awk书籍。这有点繁琐。

将此sed命令保存到文件,例如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

答案 1 :(得分: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

答案 2 :(得分:0)

试试这个......希望它有所帮助。

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