2011-06-08 87 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