2011-08-18 54 views
0

我有一個文件中包含格式:如何提取圖案之間的線條?

[PATTERN] 
line1 
line2 
line3 
. 
. 
. 
line 
[PATTERN] 
line1 
line2 
line3 
. 
. 
. 
line 
[PATTERN] 
line1 
line2 
line3 
. 
. 
. 
line 

我想從以上文件中提取以下塊:

[PATTERN] 
line1 
line2 
line3 
. 
. 
. 
line 

注:2之間的行數[PATTERN]可發生變化,所以不能依賴多少行。

基本上,我想存儲每個模式和它後面的行到數據庫,所以我必須迭代我的文件中的所有這些塊。

這是如何與Shell腳本?

+0

這真的很含糊。你想要提取哪一個? –

+0

請問你的問題。我知道它似乎含糊不清,但很難解釋。 –

+0

重複[如何使用bash腳本從標記之間的文件中提取](http://stackoverflow.com/questions/4860228/how-to-extract-from-a-file-text-between-tokens-using- bash腳本)或[使用bash在文本文件中從2個標記中提取文本](http://stackoverflow.com/questions/4857424/extract-text-from-between-2-tokens-in-a-text使用bash文件)或許? – aioobe

回答

2

這裏假設你使用bash作爲你的shell。對於其他外殼,實際的解決方案可能會有所不同。

假設你的數據是在data

i=0 ; cat data | while read line ; do \ 
    if [ "$line" == "[PATTERN]" ] ; then \ 
    i=$(($i + 1)) ; touch file.$i ; continue ; \ 
    fi ; echo "$line" >> file.$i ; \ 
done 

變化[PATTERN]通過實際的分離圖案。

這將創建一個文件file.1file.2

編輯:迴應請求關於一個awk的解決方案:

awk '/^\[PATTERN\]$/{close("file"f);f++;next}{print $0 > "file"f}' data 

的想法是打開一個新的文件,每個[PATTERN]發現時間(跳過該行 - next命令),並將所有連續行寫入該文件。如果您需要在生成的文件中包含[PATTERN],請刪除next命令。

注意轉義爲[],這對正則表達式有特殊意義。如果你的模式不包含這些,你不需要逃跑。 ^$是可取的,因爲它們將您的模式綁定到您通常需要的行首和行尾。

+0

解決方案是正確的..但我們可以直接用sed或awk或grep之類的東西來做到這一點嗎? –

0

這可能是肯定的改善,但如果你想存儲線陣列這裏是我在過去做的事:

#!/bin/bash 
file=$1 
gp_cnt=-1 
i=-1 

while read line 
do 
    # Match pattern 
    if [[ "$line" == "[PATTERN]" ]]; then 
    let "gp_cnt +=1" 
    # If this is not the first match process group 
    if [[ $gp_cnt -gt 0 ]]; then 
     # Process the group 
     echo "Processing group #`expr $gp_cnt - 1`" 
     echo ${parsed[*]} 
    fi 
    # Start new group 
    echo "Pattern #$gp_cnt catched" 
    i=0 
    unset parsed 
    parsed[$i]="$line" 

    # Other lines (lines before first pattern are not processed) 
    elif [[ $gp_cnt != -1 ]]; then 
    let "i +=1" 
    parsed[$i]="$line" 
    fi 
done < <(cat $file) 

# Process last group 
echo "Processing group #$gp_cnt" 
echo ${parsed[*]} 

我不喜歡在最後一組的加工出來的循環...