没有备份文件的SED

LA_*_*LA_ 39 macos bash sed osx-mavericks

我使用以下sed命令替换文件中的文本:

sed -i -e 's/noreply@\(.*\).example.com/noreply@example.com/' cron.yaml
Run Code Online (Sandbox Code Playgroud)

但它会cron.yaml在名称下创建文件的备份cron.yaml-e.

我试图-i走到最后:

sed -e 's/noreply@\(.*\).example.com/noreply@example.com/' -i cron.yaml
Run Code Online (Sandbox Code Playgroud)

但在这种情况下会sed返回错误.

我应该如何修改命令行以避免创建备份文件?

Mar*_*ngh 73

根据手册页,您应该在macOS上指定零长度扩展

sed -i '' -e 's/noreply@\(.*\).example.com/noreply@example.com/' 
Run Code Online (Sandbox Code Playgroud)

  • 哈!便携性就这么多!苹果为什么要强制执行?只是为了破坏别人的脚本? (2认同)
  • @ chiastic-security http://unix.stackexchange.com/a/131940更深入地探讨了差异及其存在的原因. (2认同)
  • @LA_在Linux中使用的sed的GNU版本不接受任何值作为零长度扩展名。在Linux上,sed -i s / noreply @ \(。* \)。example.com/noreply@example.com/'就像一个超级按钮 (2认同)
  • @LA_是的,关键是你没有给`-i`标志赋予任何价值;你给它“-e”作为值(因为在Mac上提供一个值似乎是强制性的)。 (2认同)
  • Apple 在这个特定的 caee 中并没有做任何错误,他们只是发布了 BSD“sed”,它总是像这样工作。各种 Loinux `sed` 版本是不同的遗产,POSIX 根本没有标准化这个选项;所以这两种行为都是不标准的。 (2认同)

小智 5

在 Windows 上,当输入以下任何内容时,GNUWIN32 sed 会失败:

sed -i "s/WhatToFind/WhatToPut/g" ".\MyDir\*"

sed -i.BackUp "s/WhatToFind/WhatToPut/g" ".\MyDir\*"

备份始终在实际文件夹上创建,文件名模式为sed$$$$$$,其中六个 $ 代表随机字母和数字。

我看不出它根本不创建任何备份,既不创建可以知道哪个文件是源的备份,也不在与源文件相同的文件夹中创建备份。

它还尝试sub-folders按原样读取files,当然也显示了impossible to read这样的消息sub-folders;当然,它不会递归子文件夹,它仅适用于同一文件夹中的所有子文件夹,但不适用于子文件夹上的内容(非递归)。

简而言之:-i根本没有按照预期工作。

我使用的GNUWIN32 sed版本是4.2.1,它是从以下位置下载的:http ://gnuwin32.sourceforge.net/packages/sed.htm

在Google上我发现一个网站谈论了这个BUG并建议下载一个ssed替代sed工具,我有点害怕没有official;链接到我在 Google 上找到的有关该-iBUG 的内容sedhttp://www.thinkplexx.com/learn/snippet/cmd/one-liner/working-in-place-sed-option-under-windows

  • 我得到的结果与你描述的完全相同。我在 Windows 上的解决方法是使用 ping 等待 1 秒钟并删除备份文件。 (3认同)