Sed 概述
Sed - 概览
Section titled “Sed - 概览”SED 这个缩写代表 Stream EDitor(流编辑器)。它是一个强大的命令行工具,用于解析和转换文本。由 Lee E. McMahon 于 1973 年至 1974 年在贝尔实验室开发,sed 是 Unix/Linux 工具集中的一个必备工具,在所有主流操作系统上都可用。
sed 作为一种非交互式的、面向行的编辑器运行。它接收文本输入(来自文件或标准输入),对每一行应用一系列编辑命令,然后将修改后的输出(默认情况下)发送到标准输出。这使得它非常适合用于脚本编写和文本文件的批量处理。
它继承了早期 ed 行编辑器的许多语法元素和概念,并且从它创建之初就支持正则表达式,这使得它在基于模式的文本处理方面极其通用。当前最常见的版本是 GNU sed,由自由软件基金会(FSF)维护。
虽然 sed 的语法对于新手来说可能看起来简洁且有些晦涩,但掌握它将解锁仅用非常短的脚本就能执行复杂文本转换的能力。它的效率和强大功能是它至今仍是系统管理员、开发人员和数据科学家关键工具的原因。
Sed 的关键特性:
Section titled “Sed 的关键特性:”- **面向流 (Stream-Oriented):**一次处理一行文本输入,从流中读取,而不是将整个文件加载到内存中(尽管一些高级操作可以使用 hold buffer,即保留缓冲区)。
- **非交互式 (Non-Interactive):**命令通常通过脚本或在命令行上提供,而不是在交互式会话中。
- **基于模式 (Pattern-Based):**广泛使用正则表达式来定位要处理的文本。
- **可编程 (Programmable):**支持一种简单的编程语言,包含用于替换、删除、插入、打印、分支等命令。
Sed 的典型用途
Section titled “Sed 的典型用途”sed 的用途非常广泛。常见应用包括:
- **文本替换 (Text Substitution):**最常见的用法。例如,替换所有出现的“old_text”为“new_text”:
sed 's/old_text/new_text/g' input.txt。 - **选择性打印 (Selective Printing):**从文件中提取并仅打印特定行。例如,仅打印包含特定模式的行:
sed -n '/pattern/p' input.txt。 - **原地编辑 (In-place Editing):**直接修改文件。GNU
sed的-i选项允许这样做:sed -i 's/foo/bar/' file.txt。(**注意:**这会直接修改文件。最佳实践是创建备份,例如sed -i.bak 's/foo/bar/' file.txt,这会创建file.txt.bak文件)。BSDsed的-i需要一个后缀,例如sed -i '.bak' 's/foo/bar/' file.txt。 - **过滤和转换 (Filtering and Transformation):**删除行、附加或插入文本、转换大小写,以及对文本数据执行其他结构修改,通常作为 shell 脚本或数据处理管道(pipeline)的一部分。
- **自动化编辑 (Automated Edits):**非交互地跨多个文件应用一致的更改。
理解 sed 需要掌握它的两个主要缓冲区:模式空间 (pattern space)(用于存放当前正在处理的行)和保留空间 (hold space)(一个用于更复杂操作的辅助缓冲区)。命令在模式空间上操作,数据可以在这两个缓冲区之间移动。