繁体   English   中英

使用 bash 脚本将包含字符串的前两行替换为特定行

[英]Replace the first 2 lines containing a string with a specific line with a bash script

我需要替换前两次出现的:

"<version>*" 

"<version>$NEW_VERSION</version>"

在已经存在的 xml 文件中。

原版的:

<groupId>my.test.group</groupId>
<artifactId>maven-parent</artifactId>
<version>1.3.0-SNAPSHOT</version>
<version>1.3.0-SNAPSHOT</version>

期望的结果:

<groupId>my.test.group</groupId>
<artifactId>maven-parent</artifactId>
<version>1.3.1-SNAPSHOT</version>
<version>1.3.1-SNAPSHOT</version>

我已经尝试了一段时间了,这个:

sed -i -e '0,/<version>*/s/<version>*/<version>1.3.1-SNAPSHOT<\/version>/' pom.xml

接近,但结果字符串是:

<groupId>my.test.group</groupId>
<artifactId>maven-parent</artifactId>
<version>1.3.1-SNAPSHOT</version>1.3.0-SNAPSHOT</version>

使用 awk:

$ awk -v new_version="1.3.1-SNAPSHOT" 'BEGIN {matches = 0} /^<version>/ && matches < 2 {print "<version>" new_version "</version>"; matches++; next} 1' pom.xml
<groupId>my.test.group</groupId>
<artifactId>maven-parent</artifactId>
<version>1.3.1-SNAPSHOT</version>
<version>1.3.1-SNAPSHOT</version>

如果你在<version>行之前有空格:

<groupId>my.test.group</groupId>
<artifactId>maven-parent</artifactId>
      <version>1.3.0-SNAPSHOT</version>
   <version>1.3.0-SNAPSHOT</version>
 <version>1.3.0-SNAPSHOT</version>

你想保存它们:

$ awk -v new_version="1.3.1-SNAPSHOT" 'BEGIN {matches = 0} /^( *)<version>/ && matches < 2 { match($0, "^ *"); print substr($0, RSTART, RLENGTH) "<version>" new_version "</version>"; matches++; next} 1' pom.xml
<groupId>my.test.group</groupId>
<artifactId>maven-parent</artifactId>
      <version>1.3.1-SNAPSHOT</version>
   <version>1.3.1-SNAPSHOT</version>
 <version>1.3.0-SNAPSHOT</version>

这可能对你有用(GNU sed):

sed -E '/<version>/{x;s/^/x/;/xx{2}/!{x;s/(<version>)[^<]*/\1NEW VERSION/;x};x}' file

在任何行上匹配<version> ,交换到保留空间,增加一个计数器,如果该计数器超过所需的总替换数,则继续不进行进一步处理。

否则,交换回模式空间并替换新版本。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM