当用sed指定行号时,它在指定的范围内执行指定的操作。所以,
sed -n '5,10 p' < file将从文件中打印第5行到第10行。因此,我的理解是,它扫描文件以找到与第一个指定参数(5)匹配的行号,并执行指定的操作,直到达到匹配第二个参数(10)的行号为止。但是,当我倒转范围时,即:
sed -n '10,5 p' < file它只打印了文件中的第10行。那么,我对sed操作方式的假设是否不正确?什么导致第10行被打印,因为指定的“范围”甚至不是一个实际的有效范围?
谢谢!
发布于 2015-03-24 21:54:43
来自手册页
可以通过指定由逗号(,)分隔的两个地址来指定地址范围。地址范围匹配从第一个地址匹配的位置开始的行,并一直持续到第二个地址匹配(包括在内)。 如果第二个地址是regexp,那么检查结束匹配将以与第一个地址匹配的行后面的行开始:范围总是至少跨越两行(当然,如果输入流结束的话除外)。 如果第二个地址小于(或等于)匹配第一个地址的行,则只匹配一行。
请注意第一段中的“包容性”一词,然后是第三段中较长的解释。
为什么?别把我们搞得形而上学.:-)
发布于 2015-03-24 21:48:38
如果指定起始行号和结束行号的范围,则结束行号必须大于起始行号。如果结束行号低于或等于起始行号,则范围将仅适用于起始行号。手册页说明了这一点,彼得·鲍尔斯发现了这一点!
首先,我认为您想要以相反的顺序打印行,在这种情况下,您可以管道到tac:
sed -n '5,10p' file | tac如果您只想使用(GNU) sed,可以使用以下脚本:
sed -n '5,10{x;H};${x;s/\n$//p}'如果当前行位于5和10之间的范围内,sed将使用x交换模式缓冲区和保持缓冲区。现在,当前行位于持有缓冲区的顶部。在此之后,模式缓冲区(前一个保持缓冲区)将使用H附加到保持缓冲区。在持有缓冲器中,以反向顺序存储感兴趣线。在输入$的末尾,我们交换了hold缓冲区和模式缓冲区,替换了末尾的换行符,最后用p打印出来。使用-n命令行选项禁用正常输出。
https://stackoverflow.com/questions/29243470
复制相似问题