跳转到内容

Sed 命令

sed (Stream Editor) 是一款非交互式的流编辑器。

  • 执行模型:它按行读取文件,将读取到的行存入临时内存(模式空间/缓存区),在此执行编辑命令,处理完毕后将结果输出到终端屏幕,随后继续读取下一行。
  • 默认安全:默认情况下它绝对不会修改源文件,除非显式指定了 -i 选项。
Terminal window
sed [选项] '寻址规则 {子命令}' input_file

  • -n静默模式。关闭默认的全文打印,通常与 p (打印) 联合使用,仅显示被处理过的那几行。
  • -i就地修改 (In-place)。将修改结果直接覆写进源文件,不再输出到屏幕。
  • -e:支持多点编辑,允许在同一行命令中串联执行多条编辑脚本。
  • -f:从外部脚本文件中读取编辑指令。

决定命令应用在哪些行(注:行号从 1 开始)。

  • 2:精准定位第 2 行。
  • 2,5:定位第 2 到第 5 行区间。
  • 1~2:奇数行(从 1 开始,步长为 2)。
  • 2,$:从第 2 行一直到 文件末尾 ($)
  • 1,2!:排除法,处理除了 1~2 行之外的 所有剩余行
  • /pattern/:利用 正则表达式 匹配,处理包含特定字符串的行。

为了演示清晰,我们常结合 nl (Number Lines) 命令,它会自动为文件内容输出行号。

4.1. 追加/插入/覆写单行 (a / i / c)

Section titled “4.1. 追加/插入/覆写单行 (a / i / c)”
  • a (Append):在匹配行的 下一行 追加新文本。
  • i (Insert):在匹配行的 上一行 插入新文本。
  • c (Change):将匹配的多行整体 替换(覆盖) 为新文本。
Terminal window
# 在第 2 行之后追加多行文本 (使用反斜杠 \ 换行)
nl testfile | sed '2a Drink tea or ......\
drink beer ?'
# 将第 2 到 5 行的整体内容,强行替换为单行提示
nl testfile | sed '2,5c No 2-5 number'
  • d (Delete):直接将匹配的整行从缓冲区抹除。
Terminal window
# 删除从第 2 行到文件末尾的所有内容
nl testfile | sed '2,$d'

这是 sed 使用频率最高的功能。语法:s/旧字符串/新字符串/修饰符

  • 修饰符 g:代表 Global,全局替换整行所有匹配到的词(默认只替换该行第一个)。
  • 修饰符 p:代表 Print,配合 -n 选项,仅打印发生替换的行。
  • 修饰符 w:代表 Write,将发生替换的行直接提取写入到另一个文件。
Terminal window
# 将文件中所有的 "123" 替换为 "hello",静默打印并提取写入 2.txt
sed -n 's/123/hello/gpw 2.txt' 1.txt