sed在PATTERN1和PATTERN2或PATTERN3之间打印文本

问题描述

sed可以在PATTERN1和PATTERN2或PATTERN3之间打印文本吗?例如,对于下面的两个示例,我希望显示输出:

样本1

Not lemur
Lemur
  Ring-Tailed
  Mouse
  Catta
Fusa
  Bad

示例2

Not lemur
Lemur
  Ring-Tailed
  Mouse
  Catta

所需的输出:

Lemur
  Ring-Tailed
  Mouse
  Catta

到目前为止,我的sed命令是sed -n '/^Lemur/,$p',但是它还会显示“ Fusa \ n Bad”(我不想要)。 sed是否具有“或”功能,例如'/^Lemur/,($|^[^\s])p',目的是从Lemur匹配到输入的末尾,或者不是以空格开头的行。另外,我只想打印以空格开头的第一个模式(狐猴)之后的行(即,我不想在第一个示例中打印“ Fusa”)。

解决方法

sed是对单个字符串执行s/old/new/的最佳工具。除此之外,只要使用awk。

$ awk '/^\S/{f=/^Lemur/} f' file1
Lemur
  Ring-Tailed
  Mouse
  Catta

$ awk '/^\S/{f=/^Lemur/} f' file2
Lemur
  Ring-Tailed
  Mouse
  Catta

如果您没有\S的GNU awk,则只需使用[^[:space:]]

,

这可能对您有用(GNU sed):

sed ':a;/^Lemur/{:b;n;/^\S/ba;bb};d' file

标记周期的开始。

如果一行以单词Lemur开头:

  • 标记循环的开始。
  • 打印当前行,然后将下一行提取到模式空间中。
  • 如果模式空间以非空格字符开头,请转到循环的开头并重复。
  • 否则转到循环的开头。

所有其他行都将删除。


替代方法:

sed -n '/^\S/{:a;x;/^Lemur/p;$q;x;h};//!H;$ba' file

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...