194

我想在 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
4

7 回答 7

362

您可以-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™ 将(恕我直言)sed非破坏性地使用,测试它是否干净地退出,然后才删除无关文件。

于 2011-09-27T17:44:03.697 回答
27

我对 MacOS 有类似的问题

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

不起作用,但是

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

效果很好。

于 2014-06-19T06:00:02.083 回答
13

-i标志可能对您不起作用,因为您遵循了GNU sed的示例,而 macOS 使用BSD sed,并且它们的语法略有不同。

所有其他答案都告诉您如何更正语法以使用 BSD sed。另一种方法是在您的 macOS 上安装 GNU sed:

brew install gsed

然后使用它代替sedmacOS 附带的版本(注意g前缀),例如:

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

如果您希望 GNU sed 命令始终可移植到您的 macOS,您可以将“gnubin”目录添加到您的路径中,方法是在您的.bashrc/.zshrc文件中添加类似这样的内容(运行brew info gsed以查看您到底需要做什么):

export PATH="/usr/local/opt/gnu-sed/libexec/gnubin:$PATH"

从那时起,GNU sed 成为您的默认 sed,您可以简单地运行:

sed -i 's/oldword/newword/' file1.txt
于 2021-01-03T02:19:37.083 回答
10
sed -i -- "s/https/http/g" file.txt
于 2018-05-09T03:17:22.843 回答
5

您可以按照已经建议的方式使用-i''( --in-place) 。sed请参阅:就地参数,但请注意,该选项-i-i是非标准 FreeBSD 扩展,可能在其他操作系统上不可用。其次sed媒体编辑器,而不是文件编辑器


另一种方法是在 Vim Ex 模式下使用内置替换,例如:

$ ex +%s/foo/bar/g -scwq file.txt

对于多个文件:

$ ex +'bufdo!%s/foo/bar/g' -scxa *.*

要递归编辑所有文件,您可以使用**/*.*shell 是否支持(通过 启用shopt -s globstar)。


另一种方法是使用gawk其新的“就地”扩展,例如:

$ gawk -i inplace '{ gsub(/foo/, "bar") }; { print }' file1
于 2015-04-19T20:57:19.403 回答
4

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

于 2018-08-10T20:18:34.003 回答
0

您可以使用:

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

例子:

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

这在Mac中完美无缺。

于 2018-07-25T09:30:21.123 回答