bash,sed,awk:提取范围内的行

sas*_*ang 1 bash awk sed

我该如何用sed提取两种模式之间的界限,即数据写入一个文件,然后提取下一范围之间的界限和写入文本到另一个文件?例如,给出以下输入:

pattern_a
line1
line2
line3
pattern_b
pattern_a
line4
line5
line6
pattern_b
Run Code Online (Sandbox Code Playgroud)

我希望line1 line2和line3出现在一个文件中,line4 line5和line6出现在另一个文件中.我看不出这样做,而无需使用一个循环,并保持循环迭代之间的一些状态,其中状态告诉你在哪里SED必须开始启动搜索来寻找开始模式(pattern_a)再次的方式.

例如,在类似bash的伪代码中:

while not done
  if [[ first ]]; then
    sed -n -e '/pattern_a/,/pattern_b/p' > $filename
  else
    sed -n -e '$linenumber,/pattern_b/p' > $filename
  fi
  linenumber = last_matched_line
  filename = new_filename
Run Code Online (Sandbox Code Playgroud)

使用sed有一种漂亮的方式吗?或者会更好吗?

rip*_*pat 8

这个怎么样:

awk '/pattern_a/{f=1;c+=1;next}/pattern_b/{f=0;next}f{print > "outfile_"c}' input_file
Run Code Online (Sandbox Code Playgroud)

这将为outfile_x每个范围创建一个.