2014-03-04 46 views
1

我有一個文件,我在尋找2個模式匹配,然後將每個匹配的行存儲到數組值。 但它不是存儲值存儲awk命令匹配模式輸出行到數組索引

我的Shell命令

#Removing new line chars 
a=`sed ':a;N;$!ba;s/\n/ /g' sample.txt` 
#storing each matched pattern row by row 
while read v1; do 
y[i]="$v1" 
((i++)) 
done < <(awk -F '<abc>|</abc>' '{for (i=2; i<=NF; i+=2) print $i}' <<< "$a") 

輸出空值:

echo ${y[0]} is empty 
echo ${y[1]} is empty 
echo ${y[2]} is empty 

應該

echo ${y[0]} = 1. I am here to show 
echo ${y[1]} = 2. I am here to show 
echo ${y[2]} = 3. I am here to show 

我的文件是:sample.txt的

<abc> 
1. I am here to show 
</abc> 
<no> 
</no> 
<abc> 
2. I am here to show 
</abc> 
<abc> 
3. I am here to show 
</abc> 
<no> 
</no> 
+0

使用XML解析器會讓生活變得更加簡單。 – devnull

+0

@devnull:不需要xml解析器。因爲它不是一個xml文件。它是文本文件。它可能有也可能沒有xml標籤。在這個例子中,我正在尋找標籤。如果它存在,那麼我需要相應地存儲 – logan

+0

我不知道你的'sed'在做什麼,但如果它是評論所說的話,你可以簡單地用... tr -d'\ n'

回答

0

,我發現自己的問題......

變量$i已經設置爲某個值,所以當我做我++它存儲的價值到一些數組索引。

我做i=0然後重新執行,它的工作原理

1

我覺得這是對眼睛可能更容易一點:

#!/bin/bash 
declare -a y 
while read x; do 
    y[i]=$x 
    ((i++)) 
done < <(awk '/^<abc>/ {p=1;next} 
       /^<\/abc>/ {p=0;next} p' sample.txt) 
echo ${y[*]} 

awk,變量p決定,如果我們印刷當前行。當我們找到<abc>時它被設置,當我們找到</abc>時被清除。