不知道最新情况如何,我用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
答案 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
。删除它。