2014-03-04 24 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>时被清除。