在OS X上使用sed进行就地编辑

问题描述 投票:118回答:6

我想在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
macos file-io sed in-place
6个回答
240
投票

您可以正确使用-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,测试它是否干净地退出,然后才删除无关的文件。


16
投票

我和MacOS有类似的问题

sed -i '' 's/oldword/newword/' file1.txt

不起作用,但是

sed -i"any_symbol" 's/oldword/newword/' file1.txt

效果很好。


4
投票

您可以使用:

sed -i -e 's/<string-to-find>/<string-to-replace>/' <your-file-path>

例:

sed -i -e 's/Hello/Bye/' file.txt

这在Mac上完美无缺。


3
投票

你可以使用-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

2
投票
sed -i -- "s/https/http/g" file.txt

1
投票

这会创建备份文件。例如。 sed -i -e 's/hello/hello world/' testfile对我来说,在同一个目录中创建一个备份文件testfile-e。

© www.soinside.com 2019 - 2024. All rights reserved.