没有备份文件的 SED

Posted

技术标签:

【中文标题】没有备份文件的 SED【英文标题】:SED without backup file 【发布时间】:2014-10-18 15:33:30 【问题描述】:

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

sed -i -e 's/noreply@\(.*\).example.com/noreply@example.com/' cron.yaml

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

我试图将-i 移到最后:

sed -e 's/noreply@\(.*\).example.com/noreply@example.com/' -i cron.yaml

但在这种情况下,sed 返回一个错误。

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

【问题讨论】:

你不需要把-e 【参考方案1】:

Windows 解决方法

接受的答案不适用于 GNUWin32 sed。我尝试了几种变体(-i ''-i - 就像@Anonymous 说的那样),但它仍然创建了一些备份文件。

对我来说最简单的解决方法是使用:

    sed 随 Git for Windows 一起提供 sed 在 WSL 外壳中。

两者都工作得很好。

【讨论】:

【参考方案2】:

根据man page,您应该在 macOS 上指定零长度扩展

sed -i '' -e 's/noreply@\(.*\).example.com/noreply@example.com/' 

【讨论】:

哈!便携性非常好!为什么苹果会强制执行此操作?就为了他们可以破坏其他人的脚本? @chiastic-security unix.stackexchange.com/a/131940 更深入地探讨了差异及其存在的原因。 @LA_ Linux 中使用的 GNU 版本的 sed 不接受任何值作为零长度扩展。在 linux 上 sed -i 's/noreply@\(.*\).example.com/noreply@example.com/' 就像一个魅力 @LA_ 是的,关键是你没有给-i 标志没有价值;你给它-e作为值(因为在Mac上提供一个值似乎是强制性的)。 Apple 在这个特定的 caee 中没有做错任何事情,他们只是发布 BSD sed,它总是这样工作。各种 Loinux sed 版本是不同的遗产,POSIX 根本没有标准化这个选项;所以这两种行为都是非标准的。【参考方案3】:

在 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

在谷歌上我发现了一个关于这个BUG的网站,并建议下载ssed而不是sed工具,我有点害怕不是official;链接到我在 Google 上找到的关于 sed 上的 -i BUG 的内容:http://www.thinkplexx.com/learn/snippet/cmd/one-liner/working-in-place-sed-option-under-windows

【讨论】:

我得到的结果和你描述的完全一样。我在 Windows 上的解决方法是使用 ping 等待 1 秒并删除备份文件。

以上是关于没有备份文件的 SED的主要内容,如果未能解决你的问题,请参考以下文章

OpenLDAP备份和恢复

mysql 单表批量备份sh文件

sed 就地标志,适用于 Mac (BSD) 和 Linux

mac sed 使用踩坑实录

临时记录

sed命令在mac和linux下的区别