没有备份文件的 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的主要内容,如果未能解决你的问题,请参考以下文章