2011-06-08 49 views
1

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

pattern_a 
line1 
line2 
line3 
pattern_b 
pattern_a 
line4 
line5 
line6 
pattern_b 

我想行1 2号线和3号线出现在一个文件,4号线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这样做的很巧妙的方法?或者awk会好些?

回答

8

如何:

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

这将为每个范围outfile_x

+0

哇,谢谢你是最好的 – sashang 2011-06-08 06:37:09

+1

空白是免费的,不要害怕它 – 2011-06-08 10:59:22