首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PATTERN1和PATTERN2或PATTERN3之间的sed打印文本

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

Stack Overflow用户
提问于 2020-09-02 03:07:19
回答 2查看 145关注 0票数 0

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

样本1

代码语言:javascript
复制
Not lemur
Lemur
  Ring-Tailed
  Mouse
  Catta
Fusa
  Bad

示例2

代码语言:javascript
复制
Not lemur
Lemur
  Ring-Tailed
  Mouse
  Catta

期望产出:

代码语言:javascript
复制
Lemur
  Ring-Tailed
  Mouse
  Catta

到目前为止,我的sed命令是sed -n '/^Lemur/,$p',但它也打印"Fusa\n Bad",这是我不想要的。sed是否具有" or“特性,如'/^Lemur/,($|^[^\s])p',其目的是从Lemur匹配到输入的末尾,或者不以空格开头的行。另外,我只想打印以空格开头的第一个模式(Lemur)之后的行(也就是说,我不想在第一个示例中打印"Fusa“)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-09-02 03:46:07

sed是对单个字符串执行s/old/new/的最佳工具。对于比这更复杂的事情,只需使用awk。

代码语言:javascript
复制
$ awk '/^\S/{f=/^Lemur/} f' file1
Lemur
  Ring-Tailed
  Mouse
  Catta

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

如果\S没有GNU,那么只需使用[^[:space:]]即可。

票数 1
EN

Stack Overflow用户

发布于 2020-09-02 10:53:21

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

代码语言:javascript
复制
sed ':a;/^Lemur/{:b;n;/^\S/ba;bb};d' file

标记周期的开始。

如果一行以单词Lemur开头

repeat.

  • Otherwise
  • 标记循环的开始。
  • 打印当前行并将下一行提取到模式空间中。如果模式空间以非空间字符开头,则转到循环的开始,而
  • 则返回循环的开始。

所有其他行删除。

另一种选择:

代码语言:javascript
复制
sed -n '/^\S/{:a;x;/^Lemur/p;$q;x;h};//!H;$ba' file
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63698104

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档