Sed 命令
1. 工具定位与执行模型
Section titled “1. 工具定位与执行模型”sed (Stream Editor) 是一款非交互式的流编辑器。
- 执行模型:它按行读取文件,将读取到的行存入临时内存(模式空间/缓存区),在此执行编辑命令,处理完毕后将结果输出到终端屏幕,随后继续读取下一行。
- 默认安全:默认情况下它绝对不会修改源文件,除非显式指定了
-i选项。
1.1. 基础语法结构
Section titled “1.1. 基础语法结构”sed [选项] '寻址规则 {子命令}' input_file2. 核心选项参数 (Options)
Section titled “2. 核心选项参数 (Options)”-n:静默模式。关闭默认的全文打印,通常与p(打印) 联合使用,仅显示被处理过的那几行。-i:就地修改 (In-place)。将修改结果直接覆写进源文件,不再输出到屏幕。-e:支持多点编辑,允许在同一行命令中串联执行多条编辑脚本。-f:从外部脚本文件中读取编辑指令。
3. 寻址规则 (Addressing)
Section titled “3. 寻址规则 (Addressing)”决定命令应用在哪些行(注:行号从 1 开始)。
2:精准定位第 2 行。2,5:定位第 2 到第 5 行区间。1~2:奇数行(从 1 开始,步长为 2)。2,$:从第 2 行一直到 文件末尾 ($)。1,2!:排除法,处理除了 1~2 行之外的 所有剩余行。/pattern/:利用 正则表达式 匹配,处理包含特定字符串的行。
4. 核心子命令与实战 (Commands)
Section titled “4. 核心子命令与实战 (Commands)”为了演示清晰,我们常结合 nl (Number Lines) 命令,它会自动为文件内容输出行号。
4.1. 追加/插入/覆写单行 (a / i / c)
Section titled “4.1. 追加/插入/覆写单行 (a / i / c)”a(Append):在匹配行的 下一行 追加新文本。i(Insert):在匹配行的 上一行 插入新文本。c(Change):将匹配的多行整体 替换(覆盖) 为新文本。
# 在第 2 行之后追加多行文本 (使用反斜杠 \ 换行)nl testfile | sed '2a Drink tea or ......\drink beer ?'
# 将第 2 到 5 行的整体内容,强行替换为单行提示nl testfile | sed '2,5c No 2-5 number'4.2. 删除文本行 (d)
Section titled “4.2. 删除文本行 (d)”d(Delete):直接将匹配的整行从缓冲区抹除。
# 删除从第 2 行到文件末尾的所有内容nl testfile | sed '2,$d'4.3. 字符级全局替换 (s)
Section titled “4.3. 字符级全局替换 (s)”这是 sed 使用频率最高的功能。语法:s/旧字符串/新字符串/修饰符
- 修饰符
g:代表 Global,全局替换整行所有匹配到的词(默认只替换该行第一个)。 - 修饰符
p:代表 Print,配合-n选项,仅打印发生替换的行。 - 修饰符
w:代表 Write,将发生替换的行直接提取写入到另一个文件。
# 将文件中所有的 "123" 替换为 "hello",静默打印并提取写入 2.txtsed -n 's/123/hello/gpw 2.txt' 1.txt