用 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([=12=], "^ *"); print substr([=12=], 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>)[^<]*/NEW VERSION/;x};x}' file
在任何行上匹配 <version>
,交换到保留 space,递增计数器,如果该计数器超过所需的总替换数,则继续不进行进一步处理。
否则,换回模式 space 并替换为新版本。
我需要替换前两次出现的:
"<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([=12=], "^ *"); print substr([=12=], 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>)[^<]*/NEW VERSION/;x};x}' file
在任何行上匹配 <version>
,交换到保留 space,递增计数器,如果该计数器超过所需的总替换数,则继续不进行进一步处理。
否则,换回模式 space 并替换为新版本。