sed支持用“行号,$d”删除从第N行到末尾,如sed '10,$d'删第10行及之后所有行;也支持/pattern/,$d按匹配行起删;注意地址间不可有空格、$需正确转义、跨平台兼容性良好。

在 sed 中,用逗号范围(,)配合 d 命令可以删除从某一行开始直到文件末尾的内容,但要注意:**逗号范围本身不支持直接写成 10,$ 这样的“起始行到末尾”形式来删末尾——它其实是支持的,只是写法就是 10,$d,而且必须确保地址合法、无空格。**
用 行号,$d 删除从第 N 行到末尾
这是最常用也最直接的方式。其中 $ 表示最后一行,逗号表示地址范围。
-
sed '10,$d' file.txt:删除第 10 行及之后所有行(保留前 9 行) -
sed '5,$d' file.txt:删第 5 行到结尾,留前 4 行 - 注意:行号从 1 开始计数;若指定行号超出总行数(如文件只有 3 行却写
10,$d),sed 不报错,也不做任何删除
用正则匹配开头,结合 $ 删除匹配行到末尾
当不确定具体行号,但知道某行内容特征时,可用模式匹配起始点。
-
sed '/^END$/,${/^[[:space:]]*$/d;}' file.txt—— 这个稍复杂,一般更推荐分步或用更清晰写法 - 简单实用的例子:
sed '/START_PATTERN/,$d' file.txt表示:找到第一个匹配START_PATTERN的行,删除它和后面所有行 - 如果想删「从某模式行开始(含)直到文件末」,就直接用
/pattern/,$d,无需额外修饰
注意事项与常见陷阱
看似简单,但几个细节容易出错:
- 地址之间不能有空格:
sed '10, $d'是错的,会报错或行为异常;必须写成'10,$d' - 如果用双引号,注意 shell 可能解释
$:应写成"10,\$d"或直接用单引号避免变量展开 -
$在地址中是特殊符号,代表最后一行;它不能出现在正则部分里作为字面量,除非转义 - 若要“删除从某行开始(不含该行)到末尾”,需用
+1偏移:sed '10,+999999d'不可靠,稳妥做法是用sed '11,$d'(即从下一行开始删)
替代思路:用 head 更直观?
如果目标只是“保留前 N 行”,head -n N file.txt 比 sed 'N+1,$d' 更易读、更高效。但 sed 的优势在于可嵌入复杂流处理中,比如边处理边删末尾。
- 仅删末尾?优先考虑
head - 需结合其他 sed 编辑(如替换+删末尾)?坚持用
sed 'addr,$d' - 需要跨平台兼容(如 macOS sed)?注意 BSD sed 和 GNU sed 对空地址或扩展语法支持略有差异,
10,$d是 POSIX 兼容的,放心用











