57

我正在使用 sed 过滤文件列表。我有一个排序的文件夹列表,我想在特定行之后获取所有行。为了完成这项任务,我使用了此处描述的解决方案,该解决方案适用于我尝试的任何输入,但当匹配位于第一行时它不起作用。在这种情况下 sed 将删除输入的所有行

这是一个例子:

$ ls -1 /
bin
boot
...
sys
tmp
usr
var
vmlinuz

$ ls -1 / | sed '1,/tmp/d'
usr
var
vmlinuz

$ ls -1 / | sed '1,/^bin$/d'
# sed will delete all lines from the input stream

当第一行与正则表达式匹配时,我应该如何更改命令以考虑限制情况?

顺便说一句sed '1,1d',仅删除第一行即可正常工作。

4

4 回答 4

64

试试这个(仅限 GNU sed):

sed '0,/^bin$/d'

..输出是:

$sed '0,/^bin$/d' 文件
开机
...
系统
时间
用户
变量
虚拟机
于 2013-06-28T12:49:14.907 回答
49

sed命令将打印匹配行之后(包括匹配行)的所有行:

sed -n '/^WHATEVER$/,$p'

-n开关仅在被告知(命令)sed时才进行打印。p

如果您不想包含匹配行,您可以告诉 sed 从文件开头删除到匹配行:

sed '1,/^WHATEVER$/d'

(我们使用d删除行的命令。)

于 2013-06-28T12:49:34.520 回答
13

你也可以尝试:

awk '/searchname/{p=1;next}{if(p){print}}'

编辑(考虑到乔的评论)

awk '/searchname/{p++;if(p==1){next}}p' Your_File
于 2013-07-05T12:31:51.080 回答
2

我会在匹配之前插入一个标签并在范围内删除/start/,/####tag####/

于 2019-03-27T14:34:56.167 回答