AIX - 使用 Sed 替换文件中的字符串

AIX - 使用 Sed 替换文件中的字符串

在 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 命令应该可以正常工作。

相关内容