兼容Linux和MacO的sed

时间:2018-02-09 18:56:10

标签: linux macos sed

在Linux上,我有一个bash脚本,我在其中使用sed。在此脚本中,我使用“sed -i”替换。

不幸的是,在MacOS上,此版本的sedLinux sed不同。

我正在寻找一种在Linux和MacOS上使用兼容sed的方法,即为两个操作系统提供相同的脚本。

您是否可以告诉我,对于操作系统而不是gsed使用sed是否允许为此脚本提供唯一的兼容版本(其中gsed -i适用于这两种情况)

更新1:

就我而言,在MacOS 10.9.5上,我想用变量的值替换文件的line 2。我试过了:

a=2
sed -i'' -e "2c\$a" file.dat

但该行被"$a"替换,而不是a = 2的值。

有什么想法吗?

ps:我想获得Linux / MacOS便携式命令行。

1 个答案:

答案 0 :(得分:1)

遗憾的是sed中的大量行为没有充分标准化。很难说出收集所有这些内容的一般答案。

对于您的具体问题,这样的简单函数包装器就足够了。

sedi () {
    case $(uname -s) in
        *[Dd]arwin* | *BSD* ) sed -i '' "$@";;
        *) sed -i "$@";;
    esac
}

正如您所发现的,c命令的细节也很难标准化。我只是建议

sedi "2s/.*/$a/" file.dat

如果$a可能包含斜杠,显然会使用不同的分隔符;或者如果您使用的是Bash,请使用${a//[\/]/\\/}反斜杠值中的所有斜杠。

实现之间不同的其他行为包括扩展正则表达式支持(-r-E或不可用),能够使用-e传递多个脚本片段(便携式解决方案是使用换行符分隔命令),将标准输入作为参数传递给-f的能力,以及几个命令的一般语法(rw命令的文件名参数是否扩展到下一个空格,分号或换行符?你能把一个命令放在一个大括号附近吗?反斜杠换行符的精确语义是什么?它们必须在哪里强制?命令参数强制执行前的反斜杠在哪里?)以及明显的正则表达式标志和特征