macos - 如何使 sed -i 在 Mac 和 Ubuntu 中都工作?

标签 macos ubuntu sed

我同时在 Mac 和 Ubuntu 中工作,所以我想让我的脚本在 Mac 和 Ubuntu 中都工作,但是 sed -i 在这两个系统中的工作方式不同:

在 Ubuntu 中,它应该是:

sed -i'' 's/Alt/Dog/g' /tmp/example.txt

在 Mac 中,它应该是:

sed -i '' 's/Alt/Dog/g' /tmp/example.txt

最佳答案

要使相同的 -i 表示法同时适用于 GNU sed(Ubuntu、Linux)和 BSD sed(Mac OS X),你必须:

  1. 始终提供(非空)备份后缀。
  2. 将后缀附加到 -i 选项。

因此:

sed -i.bak 's/Alt/Dog/g' /tmp/example.txt

将与 sed 的两种变体一起正常工作,创建备份文件 /tmp/example.txt.bak 并覆盖原始 /tmp/example。 txt 文件,其中包含修改后的输出。 (警惕具有多个链接或符号链接(symbolic link)的文件。)

您不能在同一命令行中使用空后缀(无备份)。在 GNU 上,空字符串附加到 -i 选项(概念上——如您在问题中所示);在 BSD 上,空字符串必须是一个单独的参数。永远不会相遇。

关于macos - 如何使 sed -i 在 Mac 和 Ubuntu 中都工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34281077/

相关文章:

regex - sed 和 Perl 正则表达式替换一次,带有多个替换标志

linux - 使用 sed 或 awk 比较同一文件中的两行

objective-c - 一个应用程序代理,两个窗口

jQuery 鼠标悬停时放大

objective-c - Cocoa 始终以权限运行应用程序

xcode - 将应用程序上传到 mac 商店时,生成的 API 分析太大

unix - 在代码文件中搜索特定字符串

java - 网址为 : "/servlet" goes to "ip/servlet" instead of "ip/app/servlet"

sed - 使用 sed 将管道符号更改为空格

ubuntu - vmware ubuntu : error usb 4-1: stat urb: status -32 when connecting external drive