我想在OS X上使用sed编辑文件。我正在使用以下命令:
sed 's/oldword/newword/' file.txt
输出发送到终端。 file.txt未被修改。使用以下命令将更改保存到file2.txt:
sed 's/oldword/newword/' file1.txt > file2.txt
但是我不想要另一个文件。我只想编辑file1.txt。我怎样才能做到这一点?
我试过-i标志。这会导致以下错误:
sed: 1: "file1.txt": invalid command code f
您可以正确使用-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
,测试它是否干净地退出,然后才删除无关的文件。
我和MacOS有类似的问题
sed -i '' 's/oldword/newword/' file1.txt
不起作用,但是
sed -i"any_symbol" 's/oldword/newword/' file1.txt
效果很好。
您可以使用:
sed -i -e 's/<string-to-find>/<string-to-replace>/' <your-file-path>
例:
sed -i -e 's/Hello/Bye/' file.txt
这在Mac上完美无缺。
你可以使用-i''
(--in-place
)作为sed
的建议。请参阅:The -i
in-place argument,但请注意,-i
选项是非标准的FreeBSD扩展,可能在其他操作系统上不可用。其次sed
is a Stream EDitor, not a file editor。
另一种方法是在Vim Ex模式下使用内置替换,例如:
$ ex +%s/foo/bar/g -scwq file.txt
对于多个文件:
$ ex +'bufdo!%s/foo/bar/g' -scxa *.*
要递归编辑所有文件,如果shell支持,则可以使用**/*.*
(由shopt -s globstar
启用)。
另一种方法是使用gawk
及其新的"inplace" extension,例如:
$ gawk -i inplace '{ gsub(/foo/, "bar") }; { print }' file1
sed -i -- "s/https/http/g" file.txt
这会创建备份文件。例如。 sed -i -e 's/hello/hello world/' testfile
对我来说,在同一个目录中创建一个备份文件testfile-e。