替换多行文本时如何在第一次出现时停止[重复]

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 在所有项目中都不相同,因此我尝试搜索从&lt;/artifactId&gt;&lt;/version&gt; 的模式,并将其替换为添加到其中的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 可用)。

如何在多行替换中停止替换到第一次出现?

【问题讨论】:

实际上,是什么让您不能只在以&lt;version&gt; 开头的行上进行替换? 由于pom.xml中有这么多,而且只需要在一个地方替换,我无法全部替换。 @jonathan-lefflet,我确实解决了你提到的问题。我赶上了需要明确处理的额外行。我无法通过它。请重新考虑否决票,因为我的问题与提到的问题略有不同。 【参考方案1】:

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

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

在开始替换之前,您将完整的文件读入 sed。这只是查找带有&lt;artifactId&gt; 的行,读取下一行 (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>

【讨论】:

谢谢,给定的解决方案有效

以上是关于替换多行文本时如何在第一次出现时停止[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 sed 或 awk 正确查找和替换多行文本?

匹配时如何退出 Sed [重复]

如何在Access查询中将多行的文本值组合到一个单元格中[重复]

如何在页面底部停止双javascript触发器[重复]

如何将多行文本粘贴到python输入中[重复]

正则表达式 - 如何在第一次出现字符时停止