替换多行文本时如何在第一次出现时停止[重复]
Posted
技术标签:
【中文标题】替换多行文本时如何在第一次出现时停止[重复]【英文标题】:How to stop at first occurrence while replacing a multiline text [duplicate] 【发布时间】:2016-04-22 10:38:51 【问题描述】:我有一个文件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>
的模式,并将其替换为添加到其中的SNAPSHOT
文本。这导致将文本替换为 pom.xml
中的最后一个 version
。
我尝试了以下方法:
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'
(能够进行更改,但它会替换所有文本,直到 pom.xml
中的最后一个 version
可用)。
如何在多行替换中停止替换到第一次出现?
【问题讨论】:
实际上,是什么让您不能只在以<version>
开头的行上进行替换?
由于pom.xml中有这么多如果我正确理解了这个问题,这应该可以:
sed -r '
/<artifactId>/
n
s/(([0-9]+\.)2[0-9])(<\/version>)/\1-SNAPSHOT\3/
' infile
在开始替换之前,您将完整的文件读入 sed。这只是查找带有<artifactId>
的行,读取下一行 (n
) 并在那里进行替换。
另外,您可以将要处理的文件作为参数提供给 sed,而不是使用 cat
来传递给 sed。
这在没有-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>
【讨论】:
谢谢,给定的解决方案有效以上是关于替换多行文本时如何在第一次出现时停止[重复]的主要内容,如果未能解决你的问题,请参考以下文章