根据开始和结束模式之间的模式获取开始模式和结束模式之间的文本

Tom*_*eif 3 sed text-processing

我正在尝试在casestartStrendStrcase之间获取所有内容bbb。我明白,我怎么能得到之间的所有事件startStrendStr使用sed。我不明白我如何将它限制在bbb发生的一个实例上。

样本输入:

fff
startStr
aaa
bbb
ccc
endStr
xxx
yyy
startStr
ddd
endStr
ddd
bbb
Run Code Online (Sandbox Code Playgroud)

所需输出:

startStr
aaa
bbb
ccc
endStr
Run Code Online (Sandbox Code Playgroud)

这就是我所拥有的:

$ sed -n -e '/startStr/,/endStr/ p' sample.txt
startStr
aaa
bbb
ccc
endStr
startStr
ddd
endStr
Run Code Online (Sandbox Code Playgroud)

Val*_*yKr 6

对于第一个startStrendStr,包含/bbb/出现:

 sed -n '/startStr/ {:n; N; /endStr/ {/\n[^\n]*bbb[^\n]*\n/ {p; q}; b}; bn}'
Run Code Online (Sandbox Code Playgroud)

或者

sed -n '/startStr/ {:n; N; /endStr/ {/\nbbb\n/ {p; q}; b}; bn}'
Run Code Online (Sandbox Code Playgroud)

ifbbb不是正则表达式,它正是您需要的字符串(从开始到\n)。

解释

对于地址,/startStr/我们:

  • 设置标签:n
  • 阅读下一行N
  • 检查它是否匹配/endStr/
    • 如果是真的,检查/\nbbb\n/我们读取的这个块中的出现;
      • 如果存在,请{p; q}执行“打印并退出”,
      • 否则,b为«抛出这个块并开始搜索下一个»;
  • 如果不是块结束,我们跳到:n,即继续阅读。