更换多行文本时如何在第一次出现时停止

时间:2016-01-17 03:15:30

标签: sed

我有一个文件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>的模式,并将其替换为{{添加了1}}文字。这导致将文本替换为SNAPSHOT中可用的最后version

我尝试了以下内容:

pom.xml

(根本无法正常工作,因为它无法找到行尾)。

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' 中可用的最后version之前的所有文本。

如何在多行替换中停止替换首次出现?

1 个答案:

答案 0 :(得分:1)

如果我正确理解了这个问题,这应该有效:

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

在开始替换之前,您已将完整文件读入sed。这只是查找<artifactId>的一行,读取下一行(n)并在那里进行替换。

此外,您可以将文件作为sed的参数处理,而不是使用cat来管道输入。

这也没有-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>