在 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"/>|'
注意我还将引号从 "
更改为 '
以便于转义。
我想更改以下输入文件中的端口:
<?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"/>|'
注意我还将引号从 "
更改为 '
以便于转义。