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

时间:2011-06-08 04:57:56

标签: bash sed awk

如何获取sed以提取两个模式之间的行,将该数据写入文件,然后提取下一个范围之间的行并将该文本写入另一个文件?例如,给出以下输入:

pattern_a
line1
line2
line3
pattern_b
pattern_a
line4
line5
line6
pattern_b

我希望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

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

1 个答案:

答案 0 :(得分:8)

这个怎么样:

awk '/pattern_a/{f=1;c+=1;next}/pattern_b/{f=0;next}f{print > "outfile_"c}' input_file

这将为每个范围创建outfile_x