我有一个文件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
之前的所有文本。
如何在多行替换中停止替换首次出现?
答案 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>