在Linux上,我有一个bash脚本,我在其中使用sed
。在此脚本中,我使用“sed -i
”替换。
不幸的是,在MacOS上,此版本的sed
与Linux 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便携式命令行。
答案 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
的能力,以及几个命令的一般语法(r
和w
命令的文件名参数是否扩展到下一个空格,分号或换行符?你能把一个命令放在一个大括号附近吗?反斜杠换行符的精确语义是什么?它们必须在哪里强制?命令参数强制执行前的反斜杠在哪里?)以及明显的正则表达式标志和特征