在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…)。