【问题标题】:Remove all lines before a match with sed使用 sed 删除匹配之前的所有行
【发布时间】:2013-06-28 12:40:11
【问题描述】:

我正在使用 sed 过滤文件列表。我有一个排序的文件夹列表,我想在特定行之后获取所有行。为了完成这项任务,我使用了here 描述的解决方案,它适用于我尝试过的任何输入,但是当匹配在第一行时它不起作用。在这种情况下,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' 正常工作,只删除第一行。

【问题讨论】:

标签: sed


【解决方案1】:

试试这个(仅限 GNU sed):

sed '0,/^bin$/d'

..输出为:

$sed '0,/^bin$/d' 文件 开机 ... 系统 时间 用户 变量 虚拟机

【讨论】:

  • 这似乎是最好的选择。我看到你之前的回答说它适用于 GNU sed,现在你删除了它。我正在使用 GNU sed,所以对我来说这是正确的答案,但只是出于好奇,它是否适用于非 GNU sed?
  • 没有特定于 GNU 的命令,它应该可以工作,告诉我我的教科书。
  • 它在 OS X sed 上不起作用,但正如我告诉你的,我在 gnu 系统上需要它。
  • 啊! 0,/_Address_/ GNU 增强,应该适合你。
  • 为了完整性。要删除遵循特定模式的所有行 something 执行:sed -E '/^something$/,$d',其中-E 是 POSIX 可移植性扩展正则表达式。
【解决方案2】:

这个sed 命令将打印匹配行之后的所有行:

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

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

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

sed '1,/^WHATEVER$/d'

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

【讨论】:

  • 我也探索过这个选项,但由于包含匹配行而退出。我错过了tail -n +2 选项。所以这也很好。谢谢。
  • 你拯救了我的一天。非常简单易懂且功能齐全。如果应该包括匹配行,那肯定是最好的答案。
  • 其实,如果你使用-n语法,它会包含匹配的行。如果您使用第二种形式( sed '1,/^WHATEVER$/d'),则不会。 (在 sed 4.2.2 和 RHEL 7 Linux 上测试)。
  • sed '1,/^WHATEVER$/d' 和 sed '0,/^WHATEVER$/d' 有什么区别?它们对我产生相同的结果
【解决方案3】:

你也可以试试:

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

编辑(考虑到乔的评论)

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

【讨论】:

  • 此脚本有效,但它会在第一次出现后删除所有位置的“搜索名称”。其他解决方案不会删除它们,它们只会删除第一个匹配项和它之前的行
【解决方案4】:

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

【讨论】:

    最近更新 更多