как игнорировать разрыв строки в текстовом поиске? - PullRequest
0 голосов
/ 02 марта 2011

Используя 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 ]

2 голосов
/ 02 марта 2011

Вам нужно использовать команду 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 голос
/ 02 марта 2011

Не используйте sed для этого. разрывы строк являются частью того, кто является 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

0 голосов
/ 02 марта 2011

Попробуйте ... Надеюсь, это поможет.

sed -e 's/3.1/4.1/g' pom.xml > pom1.xml
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...