regex - awk 或 sed : Return lines between two instances of the same pattern

标签 regex bash shell awk sed

我有一个如下所示的文本文件:

-+- beginning text
hey there
hi there
ho there
-+- ending text
other stuff
that is
immaterial for
my purposes

我只想抓取 -+- 模式之间的线条,所以它会返回:

hey there
hi there
ho there

标准的 awk 方式:

awk '/beginning text/ {flag=1;next} /ending text/ {flag=0} flag {print}'

只要“开始文本”和“结束文本”是不同的模式,效果就很好。

唉,对于我需要的,“开始文本”和“结束文本”可以改变。两条线唯一一致的部分是“-+-”。文件中的所有其他文本可以完全不同;我不能依赖任何一致的模式。唯一可靠的文本是 -+-。当两个字符串相同时,awk 将失败。

关于如何返回同一模式的两个离散实例之间的线(不包括包含模式的线)的任何想法?不一定是 awk,只要能在 bash shell 脚本中运行即可。

最佳答案

如果模式相同并且您不想打印出模式行,则只需在每次看到模式时通过反转标志来组合这两种模式。

awk '/^-\+-/ {flag=!flag; next} flag {print}'

关于regex - awk 或 sed : Return lines between two instances of the same pattern,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31433486/

相关文章:

javascript - JS : Trying to test for a very specific pattern

jquery - 如果两个父级在各自的类中共享 char 字符串,则将类添加到元素

bash - 在 Bash 中遍历目录

java - Shell 脚本运行 Java Jar 服务

bash - 执行使用混合引号和星号的动态 shell 脚本命令

linux - 如何将 bash 脚本作为命令运行?

javascript - 如何解析文本

c# - 在 ITextViewLine 上运行正则表达式(Visual Studio 扩展)

bash - 超出表达式递归级别

javascript - 如何替换最后出现的逗号