如何用sed匹配指定行并保留该行,删除其后所有行?
我来帮你搞定这个Sed的需求!你想要提取文件从开头到匹配指定正则的行(包含该行),同时删除该行之后的所有内容,之前尝试的两个命令要么无效要么误删了匹配行,下面给你两个可行的Sed方案,顺便解释下为什么之前的命令不行。
方案1:匹配到目标行后直接退出(推荐)
这个方法最简单直接,利用Sed的q命令(退出命令),当匹配到目标行时立即退出Sed,这样后续的行就不会被处理,自然不会输出:
seq 5 | sed '/^3$/q'
执行后输出就是:
1 2 3
原理:Sed逐行处理内容,当遇到符合/^3$/的行时,执行q命令,Sed直接终止运行,不会再处理后面的4、5行,因此前面的1、2、3都会被正常输出。
方案2:保留指定范围的行,删除其余行
另一种思路是明确指定要保留的行范围(从第1行到匹配目标行),然后删除不在这个范围内的所有行:
seq 5 | sed '1,/^3$/!d'
执行后同样得到想要的输出。
原理:1,/^3$/表示匹配从第1行到第一个符合/^3$/的行的范围,!d表示对不在这个范围内的行执行删除操作,因此4、5行会被删除,只保留前面的内容。
为什么你之前的命令无效?
第一个命令
seq 5 | sed '/^3$/{n;,$d}':
这个命令的逻辑是匹配到3后,用n读取下一行(4),然后删除从当前行(4)到结尾的内容。但问题在于,n命令会先输出当前的3,然后读取4到模式空间,再删除4,但Sed还是会继续处理5行,导致5可能被输出;或者在更复杂的文件结构中,这个逻辑会出现异常,总之不如直接退出的方法可靠。第二个命令
seq 5 | sed '/^3$/,$d':
这个命令的意思是删除从匹配行到结尾的所有行,所以3、4、5都会被删掉,只留下1、2,自然不符合你的需求。
额外说明
如果你的文件中有多个符合/^3$/的行:
- 方案1(
q命令)会在第一个匹配行就退出,只保留到第一个3; - 方案2会保留到最后一个匹配行的内容。
你可以根据实际需求选择对应的方案。
内容的提问来源于stack exchange,提问作者iBug

