Answers:
只需d
删除第13行:
sed '13d' <file.txt
补充上述内容的一般方法是:
sed '13!d' <file.txt
因为可以做到:
sed -n ':a;${P;q};N;4,$D;ba' <file.txt
请注意,4
该数字比您所需的数字大一。因此,如果您想要最后10行,则为11
。
测试seq
:
$ seq 100 | sed -n ':a;${P;q};N;4,$D;ba'
98
$
:a # define label a
${ # match the last line
P # print the first line of the pattern space
q # quit
}
N # match all lines: append the next line to the pattern
4,${ # match the range of lines 4 to the end of the file
D # delete the first line of the pattern space
}
ba # match all lines: jump back to label a
格伦·杰克曼(Glenn Jackman)的宝贵补充:
那是“仅第N条线”。这是“所有但第N行”:
sed -n ':a;${s/^[^\n]*\n//;p;q};N;4,${P;D};ba'
与GNU sed一起使用,该\n
序列可能不适用于其他sed。
我使用BSD sed(OSX)进行了尝试,发现在上面的表格中它并没有完全起作用。问题似乎是:
;
通常用于分隔行似乎正常,但在标签后无效;
在单行{}
命令组中的最后一条命令之后执行,而GNU sed则不需要\n
通常可以在正则表达式中使用,但显然不能在方[]
括号表达式中使用。因此,要排除换行符,我们可以改用类似的东西[[:alnum:][:punct:][:graph:][:blank:]]
,尽管这可能会排除其他字符(特别是其他控制字符)。因此,这是尝试使用与平台无关的版本:
sed -n ':a
${s/^[[:alnum:][:punct:][:graph:][:blank:]]*\n//p;q;};N;4,${P;D;};ba'
这似乎可以在OSX和Ubuntu下使用。
head
/ tail
)已针对其工作进行了优化。
head
/tail
解决方案比sed
解决方案要慢得多。不过谢谢