Answers:
您可以通过为-i
标志提供后缀以将其添加到备份文件中来正确使用该标志。扩展您的示例:
sed -i.bu 's/oldword/newword/' file1.txt
将给您两个文件:一个文件名file1.txt
包含替换内容,另一个文件名包含file1.txt.bu
原始内容。
轻度危险
如果要破坏性地覆盖原始文件,请使用以下方法:
sed -i '' 's/oldword/newword/' file1.txt
^ note the space
由于行的解析方式,选项标记与其参数之间需要有一个空格,因为参数的长度为零。
除了可能破坏您的原件外,我不知道以这种方式欺骗sed的任何其他危险。但是,应注意,如果此调用sed
是脚本的一部分,则Unix Way™(IMHO)将以sed
非破坏性方式使用,测试其是否干净退出,然后才删除无关的文件。
-i''
除了可能破坏原始文件(并且没有备份)以外,出于其他原因是否还很危险?
sed
手册页的说明,如果设备上的磁盘空间不足,则可能会跨步破坏文件并导致输出结果错误。如果您在本地源代码控制sed -i ""
下工作而没有备份,则大多数情况下(或git init && git add -A . && git commit -m 'backup'
在以-i
模式运行sed之前)应该没问题。
-i''
有效,但-i ''
无效。
我对MacOS也有类似的问题
sed -i '' 's/oldword/newword/' file1.txt
不起作用,但是
sed -i"any_symbol" 's/oldword/newword/' file1.txt
效果很好。
sed -i '' <file>
有效但sed -i'' <file>
不再有效
您可以根据需要使用-i''
(--in-place
)sed
。见:在-i
就地说法,但是请注意,-i
选项是非标准的FreeBSD扩展和可能并不适用于其他操作系统。其次sed
是S tream ED管理员,而不是文件编辑器。
另一种方法是在Vim Ex模式下使用内置替换,例如:
$ ex +%s/foo/bar/g -scwq file.txt
对于多个文件:
$ ex +'bufdo!%s/foo/bar/g' -scxa *.*
要递归编辑所有文件,可以**/*.*
在shell支持的情况下使用(由启用shopt -s globstar
)。
另一种方法是使用gawk
及其新的“ inplace”扩展,例如:
$ gawk -i inplace '{ gsub(/foo/, "bar") }; { print }' file1
这将创建备份文件。例如,sed -i -e 's/hello/hello world/' testfile
对我来说,在同一目录中创建一个备份文件testfile-e。
您可以使用:
sed -i -e 's/<string-to-find>/<string-to-replace>/' <your-file-path>
例:
sed -i -e 's/Hello/Bye/' file.txt
在Mac中,此功能完美无缺。
-i
需要macOS的参数。由于您未指定文件名,因此使用-e
,这将导致-e
附加第二个文件。-e
在macOS中不存在,而是-E
。因此,macOS的正确命令是sed -i '' -E 's/Hello/Bye/' file.txt
-i
标志时,您使用的确切命令是什么?