在 RHEL 上,我能够利用sed-i命令来替换文件中的字符串,但是,在 AIX 上,似乎无法使用相同的 -i 参数。
我有一个名为 abc.xml 的文件,其中包含以下内容:
<test0/>
<test1/>
<config/>
<test2/>
我正在尝试使用以下命令:
sed -i "s+<config />+<config>3242352353242342424</config>+g" /etc/abc.xml
将 abc.xml 文件中的参数替换为:
<test0/>
<test1/>
<config>3242352353242342424</config>
<test2/>
以上可能吗?
答案1
我怀疑您的sed
命令是否适用于 RedHat,因为正则表达式中的空格与您所显示的示例文档不匹配。此外,使用面向行的文本编辑工具(如sed
.
第二个问题是您对非标准-i
选项的使用。进行就地编辑的便携式方法在 Q/A 中进行了描述如何使用 sed -i (就地编辑)实现可移植性?
假设 XML 文档格式良好,您通常会使用命令行 XML 解析器来修改文档的内容。
一种这样的命令行 XML 解析器是xmlstarlet
.
xmlstarlet ed -u '//config' -v 3242352353242342424 file.xml
这会将所有节点的值设置config
为字符串(如果需要,3242352353242342424
该值将被正确编码)。xmlstarlet
任何先前的值都将被丢弃,config
节点的任何属性将被保留。
修改后的文档将被写入标准输出,因此您可以将其重定向到新文件中。您还可以在命令行上的--inplace
子命令之后使用一个选项。ed
xmlstarlet
是已知可以工作在 Linux 和 AIX 上。
答案2
AIX 不支持该-i
选项。您必须手动重定向输出。
我建议不要在同一命令中破坏原始文件 - 只需先备份它即可。
cp /etc/abc.xml /etc/abc.xml.bak
sed "s+<config />+<config>3242352353242342424</config>+g" /etc/abc.xml.bak \
> /etc/abc.xml
使用man sed
查看可用于 AIX 的选项。命令中还有许多其他差异。不过 s 命令应该可以正常工作。