> 文本处理与搜索 > sed

sed: 编辑文件内容(原地)

sed(stream editor)是一个强大的文本流过滤和转换工具。特别是 `-i` 选项允许直接修改文件(原地编辑),从而可以在覆盖原始文件或创建备份的同时高效地处理文本。本指南重点介绍 `sed` 的原地编辑功能。

概述

sed 是一个非交互式文本编辑器,它对输入流(主要是文件)执行文本转换操作。`-i` 选项是 `sed` 最有用的功能之一,它允许将修改后的内容直接应用于原始文件,而不是发送到标准输出。这在脚本或自动化任务中批量修改文件内容时非常有用。

主要特点

sed -i 的核心功能如下:

  • 直接修改原始文件:将修改后的内容直接保存到文件中。
  • 可创建备份文件:在修改时保留原始文件的备份。
  • 支持正则表达式:可以使用强大的正则表达式进行复杂的模式匹配和替换。
  • 基于脚本的自动化:适用于在脚本或管道中批量处理文件内容。

主要选项

与 `sed` 命令一起使用的常用主要选项。特别是 `-i` 选项在直接修改文件内容时是必不可少的。

原地编辑

脚本/表达式

其他

生成的命令:

请尝试组合命令。

描述:

`sed` 执行命令。

通过组合这些选项,您可以与 AI 一起虚拟地执行命令。

使用示例

使用 `sed -i` 的实际使用示例。请注意,它会直接修改文件内容,请谨慎使用。

更改文件中的特定字符串

sed -i 's/old_string/new_string/g' example.txt

将指定文件(example.txt)中所有“old_string”更改为“new_string”。不创建备份文件。

在创建备份的同时更改字符串

sed -i.bak 's/old_string/new_string/g' example.txt

在修改文件之前创建原始文件的备份(example.txt.bak),然后将“old_string”更改为“new_string”。

删除包含特定模式的行

sed -i '/pattern_to_delete/d' example.txt

删除文件(example.txt)中包含“pattern_to_delete”字符串的所有行。

更改多个文件中的字符串

find . -name "*.txt" -exec sed -i 's/old_string/new_string/g' {} +

将当前目录中所有 .txt 文件中的“old_string”更改为“new_string”。可以使用 `find` 命令结合使用来处理多个文件。

删除文件的前 5 行

sed -i '1,5d' example.txt

删除文件(example.txt)的第一行到第五行。

删除空行

sed -i '/^$/d' example.txt

删除文件(example.txt)中的所有空行。

提示与注意事项

`sed -i` 功能强大,但会直接修改文件,因此使用时需要格外小心。请牢记以下提示和注意事项,以确保安全高效地使用。

利用备份选项

养成始终使用 `-i.bak` 或在 `-i` 后面加上扩展名来保留原始文件备份的习惯。这是在意外执行错误命令时恢复原始文件的唯一方法。

  • 示例:`sed -i.orig 's/foo/bar/g' myfile.txt`

先进行测试

在对重要文件应用 `sed -i` 之前,请务必先在副本或测试文件上运行,以确认其行为是否符合预期。不带 `-i` 选项先运行并查看标准输出结果也是一个好方法。

  • 示例:`sed 's/foo/bar/g' myfile.txt` (将修改内容输出到屏幕)

理解正则表达式

`sed` 使用强大的正则表达式。熟悉正则表达式语法可以实现更复杂、更精确的模式匹配和替换。特别是与 `s`(替换)命令一起使用。

  • 理解基本正则表达式(BRE)和扩展正则表达式(ERE)的区别。
  • 使用 `-r` 或 `-E` 选项(GNU sed)可以使用扩展正则表达式。

执行多个命令

如果需要在一次 `sed` 调用中执行多个命令,可以使用多个 `-e` 选项或利用脚本文件(`-f`)。这比多次使用管道更有效。

  • 示例:`sed -i -e 's/foo/bar/g' -e '/pattern/d' myfile.txt`

相同类别命令