如何让 sed -i 在 Mac 和 Ubuntu 中工作?

rog*_*ger 2 macos ubuntu sed

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

在 Ubuntu 中,它应该是:

sed -i'' 's/Alt/Dog/g' /tmp/example.txt
Run Code Online (Sandbox Code Playgroud)

在 Mac 中,它应该是:

sed -i '' 's/Alt/Dog/g' /tmp/example.txt
Run Code Online (Sandbox Code Playgroud)

Jon*_*ler 5

要使相同的-i符号同时适用于 GNU sed(Ubuntu、Linux)和 BSD sed(Mac OS X),您必须:

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

因此:

sed -i.bak 's/Alt/Dog/g' /tmp/example.txt
Run Code Online (Sandbox Code Playgroud)

将与 的两种变体一起正常工作sed,创建备份文件/tmp/example.txt.bak/tmp/example.txt使用修改后的输出覆盖原始文件。(注意具有多个链接或符号链接的文件。)

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