![获取除 x 到 y 之外的所有行](https://linux22.com/image/209584/%E8%8E%B7%E5%8F%96%E9%99%A4%20x%20%E5%88%B0%20y%20%E4%B9%8B%E5%A4%96%E7%9A%84%E6%89%80%E6%9C%89%E8%A1%8C.png)
我有一个像这样的文件:
A
B
C
D
E
F
我可以使用第 2 行到第 4 行sed -n 2,4p
如何获得除2到4之外的所有行?
答案1
您的示例命令确实与您想要的相反。阅读手册页并注意-n
禁用sed
的默认行为,即打印处理的每一行。您禁用行的打印,然后显式仅打印 range 中的行2,4
。
一种解决方案是启用行的默认打印,但告诉sed
删除范围内的行:
$ sed 2,4d << EOF
> A
B
C
D
E
F
> EOF
A
E
F
答案2
函数前面可以有一个
!
字符,在这种情况下,如果地址不选择模式空间,则应应用该函数。
(来源)
在你的情况下,函数是p
,地址是2,4
。
sed -n '2,4!p'
(单引号如果!
你的 shell 有特殊情况.)
答案3
恕我直言,awk 语法更简单,因为它只是基本数学:
$ awk '(2 <= NR) && (NR <= 4)' file
B
C
D
$ awk '(NR < 2) || (4 < NR)' file
A
E
F
您可以在 awk 中编写范围表达式,就像在 sed 中一样,但您不必在 awk 中这样做,因此最好不要这样做,以确保清晰可维护性等。
答案4
awk '!(NR>=2 && NR<=4)' filename
输出
A
E
F