- 論壇徽章:
- 0
|
gawk匹配多個(gè)括號(hào),結(jié)果放在數(shù)組a中,記得以前用過.
現(xiàn)在想一次性將所有匹配到的結(jié)果放到數(shù)組中,結(jié)果只取到一個(gè).
帶最后一個(gè)*時(shí)取到最后一個(gè),不帶最后一個(gè)*時(shí)取到第1個(gè)
bash-3.2$ cat match1.xml.awk
echo "<a><c>kjkjkj</c></a><b>jkjk</b><a>jkjk</a><d>dddd</d>
<a><c>kjkjkj</c></a><b>jkjk</b><a>jkjk</a><d>dddd<dd>
aaaaaaaaa44444bbbbbbbb7777777ccccccc99999dddddddd000000"|awk --re-interval '
{
n=match($0,"(<(/?[^>]+)>([^<]*))*",a);
i=0;
for (;i<=n;i++){
print "a:i="i,"a["i"]="a[ i ],"n="n;
}
n=match($0,"(([a-z]*)([0-9]*))*",a);
i=0;
for (;i<=n;i++){
print "b:i="i,"a["i"]="a[ i ],"n="n;
}
}
'
bash-3.2$ match1.xml.awk
a:i=0 a[0]=<a><c>kjkjkj</c></a><b>jkjk</b><a>jkjk</a><d>dddd</d> n=1
a:i=1 a[1]=</d> n=1
b:i=0 a[0]= n=1
b:i=1 a[1]= n=1
a:i=0 a[0]=<a><c>kjkjkj</c></a><b>jkjk</b><a>jkjk</a><d>dddd<dd> n=1
a:i=1 a[1]=<dd> n=1
b:i=0 a[0]= n=1
b:i=1 a[1]= n=1
a:i=0 a[0]= n=0
b:i=0 a[0]=aaaaaaaaa44444bbbbbbbb7777777ccccccc99999dddddddd000000 n=1
b:i=1 a[1]=dddddddd000000 n=1
bash-3.2$
希望得到的結(jié)果:
第1句
a[1]="<a>"
a[2]="a"
a[3]=""
a[4]="<c>kjkjkj"
a[5]="c"
a[6]="kjkjkj"
....
第2句:
a[1]="aaaaaaaaa44444"
a[2]="aaaaaaaaa"
a[3]="44444"
a[4]="bbbbbbbb7777777"
a[5]="bbbbbbbb"
a[6]="7777777"
能實(shí)現(xiàn)嗎?難道我記錯(cuò)了?
=======================================================================
(以下內(nèi)容為樓主2009年1月20日新增,同時(shí)修改了本貼標(biāo)題)
謝謝2樓回答,確實(shí)只有顯式的()個(gè)數(shù)才算,隱式重復(fù)的只算最后一遍的()。
match返回匹配的位置,我錯(cuò)把它當(dāng)作找到的()個(gè)數(shù)用了。
這個(gè)用法相信對(duì)大家是有用的,所以我將正將答案放到頂樓了(條件是有支持GNU extensions,即gawk):
bash-3.2$ cat match1.xml.awk
echo "<a><c>kjkjkj</c></a><b>jkjk</b><a>jkjk</a><d>dddd</d>
aaaaaaaaa44444bbbbbbbb7777777ccccccc99999dddddddd000000"|awk --re-interval '
{
n=match($0,"(<(/?[^>]+)>([^<]*))+",a);
if (n>0) {
print "a:a[0]="a[0],"RSTART="RSTART,"RLENGTH="RLENGTH;
for (i=1;a[i,"start"]!="";i++){
print "a:i="i,"a["i"]="a[ i ],"|";
}
}
delete a;
n=match($0,"(([a-z]*)([0-9]*))+",a);
if (n>0) {
print "a:a[0]="a[0],"RSTART="RSTART,"RLENGTH="RLENGTH;
for (i=1;a[i,"start"]!="";i++){
print "b:i="i,"a["i"]="a[ i ],"|";
}
}
delete a;
}
'
bash-3.2$ match1.xml.awk
a:a[0]=<a><c>kjkjkj</c></a><b>jkjk</b><a>jkjk</a><d>dddd</d> RSTART=1 RLENGTH=53
a:i=1 a[1]=</d> |
a:i=2 a[2]=/d |
a:i=3 a[3]= |
a:a[0]= RSTART=1 RLENGTH=0
b:i=1 a[1]= |
b:i=2 a[2]= |
b:i=3 a[3]= |
a:a[0]=aaaaaaaaa44444bbbbbbbb7777777ccccccc99999dddddddd000000 RSTART=1 RLENGTH=55
b:i=1 a[1]=dddddddd000000 |
b:i=2 a[2]=dddddddd |
b:i=3 a[3]=000000 |
a[0]是匹配全文,a[1]是最后一遍第1個(gè)(),是最外層的,a[2]是第2個(gè)(),也是內(nèi)層前1個(gè),a[3]是第3個(gè)(),也是內(nèi)層后1個(gè)。
重復(fù)匹配時(shí),只有最后一遍記住了。
[ 本帖最后由 zhangshebao 于 2009-1-20 21:34 編輯 ] |
|