我有一个 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
每行覆盖旧空间用下一个输入覆盖模式空间匹配线
G
ets 保留附加到模式空间的空间P
打印到\n
模式空间中第一个出现的 ewline 字符D
元素相同匹配线
但问题是,这个过程会导致每一个第一次出现后的行匹配也成为匹配在它到达下一行之前。所以它总是匹配并且从不打印。
sed '/match/x;//x'
该值将取代第一个出现的值匹配在一个有空行的文件中。
在匹配
sed
e行x
更改h
旧空间和模式空间如果新的模式空间(旧模式空间)还火柴它
x
再次改变了它们否则它会留下第一个出现的匹配在新旧
h
空间中并打印空白图案空间