如何让我的 sed 命令对文件进行永久更改?

Joh*_*ohn 39 sed

这可能吗?我在某处读到以下命令可以做到:

sed -e [命令] [文件]

但它似乎做同样的事情

sed [命令] [文件]

(它没有保存更改)。有没有办法使用sed来做到这一点?

ter*_*don 62

我认为您正在寻找-i

   -i[SUFFIX], --in-place[=SUFFIX]

          edit files in place (makes backup if SUFFIX supplied)
Run Code Online (Sandbox Code Playgroud)

例如:

$ cat foo.txt
hello world
$ sed -i 's/o/X/g' foo.txt
$ cat foo.txt
hellX wXrld
Run Code Online (Sandbox Code Playgroud)

如果您提供后缀,它将创建一个备份文件:

$ ls
foo.txt
$ sed -i.bak 's/o/X/g' foo.txt 
$ ls
foo.txt  foo.txt.bak
Run Code Online (Sandbox Code Playgroud)

修改输入文件并创建包含原始文件数据的备份。

另请注意,这是针对 GNU 的sed,不同实现之间的格式略有不同sed

  • 请注意,手册页是错误的。`sed` 不进行就地编辑。它创建一个新文件并覆盖旧文件,inode 发生变化。 (4认同)
  • 好吧,想通了。在 macOS 中,您需要为扩展参数选项显式添加一个空字符串: `sed -i '' 's/o/X/g' foo.txt` (4认同)
  • @Marco 这是就地编辑文件的安全方式。sed 文档中的“就地编辑文件”意味着原始文件(由其名称定义)被修改,而不是原始文件(由其 inode 定义)被修改。 (2认同)
  • @Gilles 我完全同意这是编辑文件的首选方式,但我几乎不会称之为 *就地 *。但这归结为如何通过 inode 或名称识别文件的问题。我会说inode,否则像`{ rm file; cmd > 文件;< file` 会得出这样的结论,即 cmd 读取和写入同一个文件,而事实并非如此。这是两个不同的文件,恰好具有相同的名称。但我不想在这里开始讨论。 (2认同)