AIX 上的 Sed 无法识别 -i 标志

Posted

技术标签:

【中文标题】AIX 上的 Sed 无法识别 -i 标志【英文标题】:Sed on AIX does not recognize -i flag 【发布时间】:2011-11-06 03:54:33 【问题描述】:

sed -i 在 AIX 上工作吗?

如果没有,我如何在 AIX 上“就地”编辑文件?

【问题讨论】:

【参考方案1】:

-i 选项是sed 命令的 GNU(非标准)扩展。它不是sed 的经典界面的一部分。

您不能直接在 AIX 上进行原位编辑。您必须执行以下操作:

sed 's/this/that/' infile > tmp.$$
mv tmp.$$ infile

您一次只能处理一个文件,而-i 选项允许您为其参数列表中的许多文件中的每一个获得结果。 -i 选项只是打包了这一系列事件。这无疑是有用的,但它不是标准的。

如果你编写这个脚本,你需要考虑如果命令被中断会发生什么;特别是,您不想留下临时文件。这导致类似:

tmp=tmp.$$      # Or an alternative mechanism for generating a temporary file name
for file in "$@"
do
    trap "rm -f $tmp; exit 1" 0 1 2 3 13 15
    sed 's/this/that/' $file > $tmp
    trap "" 0 1 2 3 13 15
    mv $tmp $file
done

如果在sed 运行时出现信号(HUP、INT、QUIT、PIPE 或 TERM),则会删除临时文件。一旦sed 完成,它会在mv 发生时忽略信号。

您仍然可以通过在与源文件相同的目录中创建临时文件等操作来增强此功能,而不是在完全不同的文件系统中创建文件。

另一个增强功能是允许在命令行上指定命令(示例中为sed 's/this/that')。这变得更棘手了!

您可以查看 Kernighan 和 Pike 在其经典著作 'The UNIX Programming Environment' 中描述的 overwrite (shell) 命令。

【讨论】:

视情况而定,您可能更喜欢:cp $file $file.bak.$$; sed 's/my/script/' $file.bak.$$ > $file 这将在执行 sed 之前为您提供备份,这可能有它的优势。【参考方案2】:

您可以在 AIX 上简单地安装 GNU 版本的 Unix 命令:

http://www-03.ibm.com/systems/power/software/aix/linux/toolbox/alpha.html

【讨论】:

【参考方案3】:

你可以在 vi 中使用 here 结构:

vi file >/dev/null 2>&1 <<@
:1,$ s/old/new/g
:wq
@

当您想在 vi 编辑模式下进行操作时,您需要一个 ESC。 对于 ESC,请按 CTRL-V ESC。 当您在非交互模式下使用它时,vi 可能会抱怨未设置 TERM。解决方法是在调用vi之前添加export TERM=vt100

【讨论】:

【参考方案4】:

另一种选择是使用好的旧版,像这样:

ed fileToModify <<EOF
,s/^ff/gg/
w
q
EOF

【讨论】:

【参考方案5】:

你可以使用 perl 来做到这一点:

perl -p -i.bak -e 's/old/new/g' test.txt

将创建一个 .bak 文件。

【讨论】:

【参考方案6】:
#!/bin/ksh
host_name=$1
perl -pi -e "s/#workerid#/$host_name/g" test.conf 

上面将在 test.conf 中将 #workerid# 替换为 $host_name

【讨论】:

以上是关于AIX 上的 Sed 无法识别 -i 标志的主要内容,如果未能解决你的问题,请参考以下文章

无法识别导航栏的图像视图上的触摸。?

Windows 上的“sshpass 无法识别”

React 无法识别 DOM 元素上的 `toggleNode` 属性

React 无法识别 DOM 元素上的 X 属性

React Router 中的“React 无法识别 DOM 元素上的道具”

Java 上的 Sikuli 无法识别图像