如何在 Linux 和 Mac OS X 之间共享 GNU sed 脚本

如何在 Linux 和 Mac OS X 之间共享 GNU sed 脚本

我有一个sed在 Linux 上使用的 GNU 脚本;它安装在/bin/sed并且似乎包含 GNUisms。我有使用 Mac OS X 的协作者。他们已安装(非 GNU)sed,位于/usr/bin/sed,并使用 Homebrew (http://mxcl.github.io/homebrew/) 可以安装 GNU ,sed就像gsed核心工具包,位于/usr/local/bin/gsed.

目前,脚本以#!/bin/sed -f.当 GNUsed安装为 时,如何修改它以便它可以在 Mac OS X 上运行gsed

另一种选择是删除 GNUism,但这可能有点困难,因为我手头没有安装 Mac OS X,无法要求我的合作者测试中间版本。

答案1

有以下几种选择:

  • 到处使用#!/usr/bin/gsed -f(假设它在/usr/bin)作为 shebang,并确保您的 Linux 环境正确地对其进行符号链接;
  • 删除 GNUism;
  • sed来自/usr/bin/gsed/usr/bin于用户目录的目录的符号链接$PATH(可能危险);
  • 制作一个如下所示的包装脚本:
#!/bin/sh

script=/foo

type gsed >/dev/null 2>&1 && exec gsed -f "$script"
exec sed -f "$script"

最终要么需要更改至少一个环境,要么更改脚本本身。

答案2

你可以让你的sed脚本以此开头:

\:;s=sed;type gsed >/dev/null 2>&1 && s=gsed; exec "$s" -f "$0" "$@";$:s/^//

这是一个无操作(尽管会稍微降低你的脚本性能),并且当由 shell 解释时,如果找到或没有则sed执行(两者都在 中查找)。gsedsed$PATH

答案3

(回答我自己的问题,或者更确切地说,提供一种在这种情况下有效的替代方法。)

脚本,即使以 sha-bang 开头,也可以从命令行应用到目标文件上sed,如.这意味着在 Mac OS X 上,可以将脚本调用为.ascript.sedtarget.txtsed -f ascript.sed target.txtgsed -f ascript.sed target.txt

相关内容