最简洁可靠的方法是使用步进地址语法:打印奇数行用sed -n '1~2p' file,偶数行用sed -n '2~2p' file;也可用n/p组合或删除法实现,但需注意加-n选项及兼容性。

直接用 sed 打印奇数行或偶数行,最简洁可靠的方法是使用步进地址(step address)语法,它清晰、高效,且兼容性好。
用步进地址法直接提取
这是最推荐的方式,语法直观,执行快,适合大多数场景: - 打印奇数行: `sed -n '1~2p' file` 表示“从第1行开始,每隔2行取一行”,即第1、3、5…行。 - 打印偶数行: `sed -n '2~2p' file` 表示“从第2行开始,每隔2行取一行”,即第2、4、6…行。用 n/p 组合技巧(适合理解原理)
这类写法利用 `n`(读下一行)和 `p`(打印当前模式空间)的配合,不依赖行号计算: - 打印奇数行: `sed -n 'p;n' file` 解释:先打印当前行(p),再跳到下一行(n),循环执行 → 实际输出第1、3、5…行。 - 打印偶数行: `sed -n 'n;p' file` 解释:先跳过当前行(n),再打印新读入的行(p)→ 输出第2、4、6…行。用删除法反向实现
不打印,而是删掉不需要的行,剩下即为目标行: - 只留奇数行(删偶数行): `sed '2~2d' file` 删除从第2行起、步长为2的所有行(即所有偶数行)。 - 只留偶数行(删奇数行): `sed '1~2d' file` 删除从第1行起、步长为2的所有行(即所有奇数行)。注意事项
- 必须加 `-n` 选项(关闭默认输出),否则 `p` 命令会与自动输出叠加,造成重复。 - 步进地址 `n~m` 中的 `n` 是起始行号,`m` 是步长;`0~2p` 在部分 GNU sed 版本中可等效于 `2~2p`,但**不具通用性,建议坚持用 `1~2` 和 `2~2`**。 - 大文件处理时,`1~2p` 比 `p;n` 略快,因前者由 sed 内部直接定位,后者需逐行状态切换。不复杂但容易忽略。











