sed命令为何打印所有行?范围匹配模式下输出不符合预期的技术咨询
为什么sed '/a/,/b/p'会打印整个文件?
我明白你现在的困惑——你想用sed -n '/a/,/b/p'只打印从包含a的行到包含b的行(包括这两行),结果却打印了整个文件的内容。这背后其实是sed的地址范围匹配规则在起作用,我们一步步拆解:
先搞懂sed范围匹配的核心逻辑
当你使用/start/,/end/这种地址范围时,sed的工作流程是:
- 从文件第一行开始扫描,直到找到匹配
start模式的行,此时进入「打印模式」,执行p命令打印该行。 - 之后的每一行,不管内容是什么,都会被打印,直到遇到匹配
end模式的行——此时打印该行,然后退出「打印模式」,后续的行不再打印。 - 但如果在进入「打印模式」后,直到文件结束都没找到匹配
end的行,sed就会一直打印到文件末尾。
你的情况为什么会打印所有行?
按照你的输入文件描述,第三行是b sed will really really enjoy writing over this,看起来应该匹配/b/模式,但结果却没触发结束逻辑,说明sed根本没在第三行匹配到/b/,所以它一直打印到了文件最后一行。可能的原因有这几个:
- 第三行的
b不是小写的半角字符:比如是全角的b、大写的B,或者前面有空格/制表符之外的不可见字符,导致正则表达式/b/无法匹配。 - 命令里的结束模式写错了:比如不小心写成了
/B/(大写)或者/bb/,而不是/b/。 - 极端情况:某些非常老旧的sed版本对范围匹配的处理有差异,但这种情况现在几乎遇不到。
验证和修正方法
你可以先单独检查第三行是否匹配/b/,执行这个命令:
sed -n '/b/p' sedtest
如果输出只有第三行,说明模式是对的;如果没有输出,那就是第三行的b有问题,或者模式写错了。
另外,如果你想精准匹配以b开头的行,避免误匹配行中间的b字符,可以把结束模式改成/^b/(^在正则表达式里表示行首),命令就变成:
sed -n '/a/,/^b/p' sedtest
内容的提问来源于stack exchange,提问作者Progamer
相关产品推荐
相关产品推荐

