在 xml 文件中使用 sed 更改值

changing value using sed in xml file

我想更改以下输入文件中的端口:

<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>SSH</short>
  <port protocol="tcp" port="22"/>
</service>

我试过以下命令但没有成功:

sed "s|\("^[[:space:]]*.+port[[:space:]]+protocol=.+port="\).*|\"3022\"\/>|" inputfile

但它并没有改变。

当我 grep -E 它 return 正确的行和高亮正确匹配:

# grep -E '^[[:space:]]*.+port[[:space:]]+protocol=.+port=' inputfile
  <port protocol="tcp" port="22"/>

为什么 sed 不能完成这项工作?

更新:我找到了另一个命令来实现这个:

sed -E '/short/,/service/  s/port=[^<]*/port=\"3022\"\/>/' inputfile

Why sed does not do the job?

因为sed正则表达式和grep正则表达式是不同的,至于你必须转义哪些字符才能获得相同的含义。在sed+表示文字+,我想你想要:

sed 's|\(^[[:space:]]*.\+port[[:space:]]\+protocol=.\+port=\).*|"3022"/>|'

而在扩展 POSIX 正则表达式中 \( 表示文字 (,其中 ( 开始一个组:

sed -E 's|(^[[:space:]]*.+port[[:space:]]+protocol=.+port=).*|"3022"/>|'

注意我还将引号从 " 更改为 ' 以便于转义。