我有一个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
执行(两者都在 中查找)。gsed
sed
$PATH
答案3
(回答我自己的问题,或者更确切地说,提供一种在这种情况下有效的替代方法。)
脚本,即使以 sha-bang 开头,也可以从命令行应用到目标文件上sed
,如.这意味着在 Mac OS X 上,可以将脚本调用为.ascript.sed
target.txt
sed -f ascript.sed target.txt
gsed -f ascript.sed target.txt