sed 流编辑

LinuxBeginner
立即练习

简介

在 Linux 中处理文本文件时,你经常需要自动修改文件,而不必打开交互式文本编辑器。例如,你可能需要从 CSV 文件中删除标题、删除空行,或从日志文件中提取指定范围的行。

这些任务可以使用 sed(流编辑器)完成。

sed 是一种功能强大的非交互式文本编辑器。它从文件或管道读取输入,对每一行执行操作,然后输出结果。这种「读取、转换、打印」的模式是经典的 Unix 工作方式,尤其适合用于管道。

这也解释了它为什么被称为流编辑器。sed 专门处理不断流动的文本,而不只是处理像全屏编辑器那样打开的文件。因此,它非常适合 shell 管道和自动化脚本。

在本实验中,你将学习如何:

  1. 删除行(d):移除不需要的标题或注释。
  2. 移除空行:使用正则表达式过滤空白行。
  3. 插入文本(i):向文件中添加新行。
  4. 打印行(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 会打印它处理的每一行。若只打印指定的行,需要:

  1. 使用 -n 选项禁止自动打印(保持静默)。
  2. 使用 p 命令明确打印指定的行。

如果不使用 -n,sed 会自动打印每一行;执行 p 时,又会再次打印选中的行,这常常会让初学者感到困惑。-n 会关闭默认打印行为,使命令只输出你明确要求的内容。

打印第 5 行到第 10 行:

sed -n '5,10p' data.csv

如果只想打印最后一行,可以使用 $ 符号表示文件末尾:

sed -n '$p' data.csv

分析大型日志文件时,如果只需要查看其中的某个部分,这种方法非常有用。

总结

在本实验中,你学习了使用 sed 进行流编辑的基础知识:

  1. 删除(d):删除指定的行(1,2d),或删除匹配某个模式的行(/^$/d)。
  2. 插入(i):在指定位置向文件流中添加文本。
  3. 打印(-n ... p):禁止默认输出,只打印选中的行。
  4. 原地编辑(-i):直接修改文件,而不是只将结果打印到屏幕。

sed 是自动化文本处理的重要工具,广泛用于 shell 脚本中的配置管理和日志分析。