【问题标题】:How to fix SED inplace replacement Mac OS and Ubuntu Issue如何修复 SED 就地替换 Mac OS 和 Ubuntu 问题
【发布时间】:2012-06-04 09:40:44
【问题描述】:

我有一个替换 PHP 常量的 Bash 脚本,例如define('xxxx',....); 有想要的。

作者:

sudo sed -E -i "" "s/^(define).*(${2})[\'|\"].*/${3}/g" "$file"

问题在于,在 Ubuntu 上,由于 i 之后有额外的空间,它会失败。

-i ""

如果我删除该空间,它将在 Ubuntu 上运行,但在 MacOS 上无法运行,例如报错。

sed: 1: "../config.php ...": invalid command code

我有哪些选项可以在 *nix 上和平地执行此命令?

提前感谢您的时间和知识。

【问题讨论】:

  • 感谢大家的快速回复:)

标签: linux macos bash ubuntu


【解决方案1】:
sudo perl -pi -e "s/^(define).*(${2})[\'|\"].*/${3}/g" "$file"

不过,我怀疑你的意思是 ['\"]

【讨论】:

  • 让我测试一下,它看起来很简单
【解决方案2】:

sed 的 -i 选项是 GNU 方言的一部分。这不是便携式的。

另一种方法是使用临时中间文件:

sed ... ${file} > ${file}.tmp && mv ${file}.tmp ${file}

还有一种是用perl代替sed,as suggested by triplee

【讨论】:

  • OS X sed 支持 -i,但在备份扩展方面略有不同。
【解决方案3】:

为了就地执行操作并禁止或避免创建备份文件,您可以根据操作系统设置一个数组条件。

[[ $(uname -s) == 'Darwin' ]] && ioption=(-i "") || ioption=(-i)
sed "${ioption[@]}" "s/^(define).*(${2})['\"].*/${3}/g" "$file"

使用了一个数组,这样引用的参数和多个选项/参数都可以工作。如果你想让额外的东西有条件,你可以向数组中添加更多。

请注意,管道不是括号表达式中的交替字符 - 相反,它是按字面意思包含的。因此,除非您想潜在地匹配管道,否则您应该省略它。在外层双引号内,单引号不需要转义。

【讨论】:

  • 感谢@Dennis Williamson,这似乎是另一种方式。然而,triplee 的解决方案似乎是直截了当的。
【解决方案4】:

在 OS X 上安装 GNU sed 并使用它。

【讨论】:

  • 请提出一个没有额外麻烦的解决方案。其他一些可以跨域工作的命令等,谢谢
  • 不乏解决方案。每个人都有自己的麻烦。
猜你喜欢
  • 1970-01-01
  • 2017-01-06
  • 2019-10-13
  • 1970-01-01
  • 2015-04-19
  • 2021-06-08
  • 2015-10-02
  • 2011-08-07
相关资源
最近更新 更多