在xml文件中使用sed更改值

在xml文件中使用sed更改值,xml,sed,scripting,Xml,Sed,Scripting,我想更改以下输入文件中的端口: <?xml version="1.0" encoding="utf-8"?> <service> <short>SSH</short> <port protocol="tcp" port="22"/> </service> 但这并没有改变 当我grep-E时,它返回正确的行和强光正确匹配: # grep

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

<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>SSH</short>
  <port protocol="tcp" port="22"/>
</service>
但这并没有改变

当我grep-E时,它返回正确的行和强光正确匹配:

# grep -E '^[[:space:]]*.+port[[:space:]]+protocol=.+port=' inputfile
  <port protocol="tcp" port="22"/>
#grep-E'^[[:space:][]*.+端口[[:space:][]+协议=.+端口='输入文件
为什么sed不做这项工作

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

sed -E '/short/,/service/  s/port=[^<]*/port=\"3022\"\/>/' inputfile
sed-E'/short/,/service/s/port=[^/'输入文件
为什么sed不做这项工作

因为
sed
regex和
grep
regex是不同的,对于哪些字符必须转义才能获得相同的含义。在
sed
+
中,我想您需要:

sed 's|\(^[[:space:]]*.\+port[[:space:]]\+protocol=.\+port=\).*|\1"3022"/>|'
而在扩展POSIX正则表达式中,
\(
表示文字
),其中
启动一个组:

sed -E 's|(^[[:space:]]*.+port[[:space:]]+protocol=.+port=).*|\1"3022"/>|'
注意:为了更容易转义,我还将引号从
改为

为什么sed不做这项工作

因为
sed
regex和
grep
regex是不同的,对于哪些字符必须转义才能获得相同的含义。在
sed
+
中,我想您需要:

sed 's|\(^[[:space:]]*.\+port[[:space:]]\+protocol=.\+port=\).*|\1"3022"/>|'
而在扩展POSIX正则表达式中,
\(
表示文字
),其中
启动一个组:

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

注:我还将引号从
更改为
,以便于转义。

您是否尝试过使用
-E
标志进行
sed
,就像您使用
grep
一样?是的,它会返回错误“sed:-E表达式”1,char 68:s命令的RHS上的无效引用\1”。我建议使用XML/HTML解析器(xmlstarlet,xmllint…)您是否尝试过使用
-E
标志使用
sed
,就像您使用
grep
一样?是的,它返回错误“sed:-E expression#1,char 68:s'命令的RHS上的无效引用”\1我建议使用XML/HTML解析器(xmlstarlet,xmllint…)。