简介
在 Linux 中处理文本文件时,你经常需要自动修改文件,而不必打开交互式文本编辑器。例如,你可能需要从 CSV 文件中删除标题、删除空行,或从日志文件中提取指定范围的行。
这些任务可以使用 sed(流编辑器)完成。
sed 是一种功能强大的非交互式文本编辑器。它从文件或管道读取输入,对每一行执行操作,然后输出结果。这种「读取、转换、打印」的模式是经典的 Unix 工作方式,尤其适合用于管道。
这也解释了它为什么被称为流编辑器。sed 专门处理不断流动的文本,而不只是处理像全屏编辑器那样打开的文件。因此,它非常适合 shell 管道和自动化脚本。
在本实验中,你将学习如何:
- 删除行(
d):移除不需要的标题或注释。 - 移除空行:使用正则表达式过滤空白行。
- 插入文本(
i):向文件中添加新行。 - 打印行(
p):提取指定范围的行。
删除行
先查看示例文件的内容。
cat /home/labex/project/data.csv
你会看到文件开头有两行以 # 开头的注释。现在需要删除这两行。
在 sed 中,使用 d 命令删除行。
1d删除第 1 行。1,2d删除第 1 行到第 2 行。
按行号定位是 sed 的基本用法之一。地址用于告诉 sed 某个命令应作用于哪一行或哪一段行,编辑命令则说明要执行的操作。
运行以下命令预览删除结果,但不要修改文件:
sed '1,2d' data.csv
输出内容中不再包含前两行。不过,再次查看文件内容:
cat data.csv
你会发现这两行仍然存在。默认情况下,sed 会将输出发送到屏幕(标准输出),而不会修改原文件。这是一种安全机制。
如果要直接修改文件(即进行「原地编辑」),请使用 -i 选项:
sed -i '1,2d' data.csv
验证修改结果:
cat data.csv
现在,文件开头的两行标题已被永久删除。
移除空行
文件中仍然包含会破坏数据结构的空白行。在处理后的数据文件中,我们通常不需要这些空行。
要移除空行,需要将删除命令(d)与正则表达式(Regex)结合使用。
^匹配行的开头。$匹配行的结尾。^$匹配从开头直接结束的行,也就是空行。
这是 sed 将两层规则结合起来的示例:地址模式和编辑操作。模式 /^$/ 选择匹配的行,d 则删除这些行。
命令 /^$/d 告诉 sed「删除所有匹配空行模式的行」。
运行以下命令,直接移除文件中的空行:
sed -i '/^$/d' data.csv
检查结果:
cat data.csv
现在,文件应当变成没有间隔的紧凑数据列表。
插入文本
现在无用的注释已经删除。假设你要为文件添加一个合适的分类标题。
i(Insert,插入)命令会在指定行的前面添加文本。
1i Text在第 1 行前插入「Text」。
a(Append,追加)命令会在指定行的后面添加文本。
1a Text在第 1 行后插入「Text」。
除了删除和替换之外,i、a 等命令还说明 sed 不仅限于替换文本。它可以在文本流经过时删除、添加和选择行,从而改变文本流的结构。
运行以下命令,在文件最顶部插入「Company Confidential」:
sed -i '1i Company Confidential' data.csv
验证文件内容:
cat data.csv
新行已插入文件开头,原来的其他行全部向下移动。
打印指定行
有时你不想修改文件,只想提取指定的行。此时,sed 可以像更灵活的 head 或 tail 一样使用。
默认情况下,sed 会打印它处理的每一行。若只打印指定的行,需要:
- 使用
-n选项禁止自动打印(保持静默)。 - 使用
p命令明确打印指定的行。
如果不使用 -n,sed 会自动打印每一行;执行 p 时,又会再次打印选中的行,这常常会让初学者感到困惑。-n 会关闭默认打印行为,使命令只输出你明确要求的内容。
打印第 5 行到第 10 行:
sed -n '5,10p' data.csv
如果只想打印最后一行,可以使用 $ 符号表示文件末尾:
sed -n '$p' data.csv
分析大型日志文件时,如果只需要查看其中的某个部分,这种方法非常有用。
总结
在本实验中,你学习了使用 sed 进行流编辑的基础知识:
- 删除(
d):删除指定的行(1,2d),或删除匹配某个模式的行(/^$/d)。 - 插入(
i):在指定位置向文件流中添加文本。 - 打印(
-n ... p):禁止默认输出,只打印选中的行。 - 原地编辑(
-i):直接修改文件,而不是只将结果打印到屏幕。
sed 是自动化文本处理的重要工具,广泛用于 shell 脚本中的配置管理和日志分析。



