【问题标题】:Compatibilty with sed for both Linux and MacOs与 Linux 和 MacO 的 sed 兼容
【发布时间】:2018-07-20 14:38:30
【问题描述】:

在 Linux 上,我有一个使用 sed 的 bash 脚本。在此脚本中,我使用“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 便携式命令行。

【问题讨论】:

  • 你能不能不使用-i 标志并在你的sed 之后做一个mv -f your_sed_output your_original_file?那么您就不必胡乱安装和祈祷了。
  • 您可以使用sed -i.bak '....',它在 Lunux 和 MacOS 上都可以正常工作
  • gsed 在 BSD(Darwin、MacOS)或 Solaris 上代表 GNU sed,与大多数 Linux 发行版附带的 sed 相同。不幸的是,我不认为(所有)Linux 发行版也会有 g 前缀名称(我的没有)(顺便说一句。同样的故事 awktar 和其他)。
  • Perl 可以做所有sed 可以做的事情,甚至更多,而且在平台之间更加正交和一致,包括 Solaris。
  • sed -e "2s|.*|$a|" file.dat怎么样

标签: linux macos sed


【解决方案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 命令的文件名参数是否扩展到下一个空格、分号或换行符?你能将命令紧邻大括号?反斜杠换行符的精确语义是什么?它们在哪里是强制性的?命令参数之前的反斜杠在哪里是强制性的?),显然是正则表达式标志和功能。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-28
  • 2021-03-06
  • 2017-06-13
  • 2022-07-07
  • 2019-07-29
  • 1970-01-01
  • 2018-08-16
相关资源
最近更新 更多