如何sed两个相同的值而不影响另一个

如何sed两个相同的值而不影响另一个

我有一个 xml 文件,我想更改该文件上的一个值:

param name=swam_license_ports_overdraft_thresh

99

param name="strike_license_ports_overdraft_thresh"

99

我想要的结果是将 param name=swam_license_ports_overdraft_thresh 下的值 99 更改为 90,并且 param name="strike_license_ports_overdraft_thresh" 下的另一个值 99 不应更改。

答案1

如果我理解正确,你只想删除第一个匹配项,所以你可以这样做:

sed -e '/99/{s//XXX/;:a;n;ba}' file

使用 GNU sed,您可以:

sed -e '0,/99/s//XXX/' file

答案2

删除第一个匹配项(保留行)

awk '!x&&/99/{x++;$0=y}1' file

删除第一个匹配项(不保留行)

awk '!x&&/99/{x++;next}1' file

替换第一个匹配项

awk '!x&&/99/{x++;$0="98"}1' file

答案3

sed -n 'h;/match/n;G;P;//D'

这只会删除第一个匹配在任何输入文件中。它

  • h每行覆盖旧空间

  • 用下一个输入覆盖模式空间匹配线

  • Gets 保留附加到模式空间的空间

  • P打印到\n模式空间中第一个出现的 ewline 字符

  • D元素相同匹配线

但问题是,这个过程会导致每一个第一次出现后的行匹配也成为匹配在它到达下一行之前。所以它总是匹配并且从不打印。

sed '/match/x;//x'

该值将取代第一个出现的值匹配在一个有空行的文件中。

  • 匹配sede行x更改h旧空间和模式空间

  • 如果新的模式空间(旧模式空间)火柴x再次改变了它们

  • 否则它会留下第一个出现的匹配在新旧h空间中并打印空白图案空间

相关内容