首页 > 解决方案 > 跨平台兼容的 sed 命令?

问题描述

我正在尝试使用sed,但我想在 Linux 和 Mac 下都能正常运行。目前,我有这样的事情:

if test -f ${GENESISFILE};
then
    echo "Replacing ..."
    sed -i '' "s/ADDRESS/${ADDRESS}/g" ${GENESISFILE}
else
    echo "No such file"
fi

现在,关键是使用-i ''部分它在 Mac 下可以正常运行,但在 Linux 下不能,如果我删除它,它在 Mac 下就不能工作。使它跨平台兼容的正确方法是什么?

标签: sed

解决方案


而不是sed单线:

sed -i '' "s/ADDRESS/${ADDRESS}/g" ${GENESISFILE}

使用这个跨平台的 Perl one-liner,它在 Linux 和 macOS 上都可以正常运行:

perl -i.bak -pe 's/ADDRESS/$ENV{ADDRESS}/g' ${GENESISFILE}

Perl 单行器使用这些命令行标志:
-e:告诉 Perl 查找内联代码,而不是在文件中。
-p:一次循环输入一行,$_默认情况下将其分配给。print $_在每次循环迭代后添加。
-i.bak:就地编辑输入文件(覆盖输入文件)。在覆盖之前,通过在其名称后附加扩展名来保存原始文件的备份副本.bak-i单独使用,不使用.bak,跳过制作备份。

还请参见
perldoc perlrun::如何执行 Perl 解释器:命令行开关


推荐阅读