SED在OSX中使用时添加e后缀文件?

时间:2015-04-27 20:02:56

标签: macos sed

不知道最新情况如何,我用gnu sed替换了,但我得到了备份文件。这正是我在做的事情

mkdir tmp && cd $_
echo 'test' > test.txt
ls
  test.txt

sed -ie 's/test/replaced/g' test.txt
ls
  test.txt
  test.txte

这里发生了什么,我该如何防止这种情况发生?它应该就地编辑,而不是创建备份

sed版本(GNU sed) 4.2.2

2 个答案:

答案 0 :(得分:3)

根据mklement0的精彩评论,POSIX规范告诉我们:

  

使用可选的option-arguments,POSIX实用程序约定要求(强调他的)"符合要求的应用程序应将该选项的任何option-argument与相同参数字符串中的选项直接相邻,而不进行干预字符

因为GNU sed认为-i的后缀参数是可选的,所以它要求它与选项参数相互拥抱,所以当你写-ie GNU sed解释为请求后缀{{ 1}}用于e参数。 (BSD sed将以相同的方式解释它,原因在底部的附加信息中有解释。)

这一切意味着您需要使用-i来获取您想要的行为(对于GNU sed)(对于BSD sed,您需要-i -e)。

有关GNU sed和BSD sed之间令人遗憾但有趣的区别的其他详细信息:

GNU sed和BSD sed(OSX sed)不同意-i '' -e参数的后缀值是可选的还是必需的。

这很重要,因为补充了上面的POSIX要求,我们在规范中也发现了以下内容(再次强调mkelement0')

  

具有强制选项 - 参数[...]的选项,符合要求的应用程序应对该选项及其选项参数使用单独的参数。 但是,符合要求的实现还应允许应用程序在同一参数字符串中指定option和option-argument,而不插入字符

GNU sed认为后缀是可选的(这导致上面的行为)因为它接受可选参数的拥抱-i但忽略了单独的e(或其他任何东西)作为单独的参数。

BSD sed认为后缀是强制性的(即使它可能是空的)这意味着该选项应该与带有空格的标志(例如-e-i .bak)分开,但是作为& #34;然而"注意,BSD sed还允许任何非空后缀与-i ''标志相关联。

这种不同意见,正如mklement0指出的那样,偶尔出现在SO上,这意味着你不能以一种可移植到sed的GNU和BSD版本的方式使用空的就地编辑后缀。

答案 1 :(得分:0)

与往常一样,man页面有助于:

-i extension:              就地编辑文件,使用指定的扩展名保存备份。如果给出了零长度扩展,则不会保存备份。建议在就地编辑时提供零长度扩展 因为您在磁盘空间耗尽的情况下冒着损坏或部分内容的风险等等。

您使用-ie会在最后添加e。删除它。