2014-10-30 41 views
0

美好的一天!Awk輸入變量通常爲

我有下面的代碼:

BLOCK=`awk ' 
/\/\* R \*\// { 
    level=1 
    count=0 
} 
level { 
    n = split($0, c, ""); 
    for (i = 1; i <= n; i++) 
    { 
    printf(c[i]); 
    if (c[i] == ";") 
    { 
     if(level==1) 
     { 
      level = 0; 
      if (count != 0) 
       printf("\n"); 
     }; 
    } 
    else if (c[i] == "{") 
    { 
     level++; 
     count++; 
    } 
    else if (c[i] == "}") 
    { 
     level--; 
     count++; 
    } 
    } 
    printf("\n") 
}' $i` 

該代碼切割件的文件從/* R */馬克到「;」象徵着考慮到諸如大括號等細節,但這並不重要。我想用變量代替硬編碼的/ * R * /:

RECORDSEQ="/* R */" 
... 
BLOCK=`awk -v rec="$RECORDSEQ" ' 
rec { 
    level=1 
    count=0 
} 

但是這並不奏效。

我該如何解決?

預先感謝您。

+3

也許'$ 0〜rec {...}' – 2014-10-30 22:37:19

+0

但它已經使用$ 0,因爲它從文件讀取:'}} printf(「\ n」)}'i' – 2014-10-30 22:41:41

+0

Mark是對的。要獲得動態正則表達式(從字符串中讀取正則表達式)才能正常工作,需要明確使用正則表達式運算符。 – ooga 2014-10-30 22:48:09

回答

0

找到了解決辦法:

RECORDSEQ="/* R */" 

# Construct regexp for awk 
RECORDSEQREG=`echo "$RECORDSEQ" | sed 's:\/:\\\/:g;s:\*:\\\*:g'` 

# Cycle for files 
for i in $SOURCE; 
do 
    # Find RECORDSEQ and cut out the block 
    BLOCK=`awk -v rec="$RECORDSEQREG" ' 
$0 ~ rec { 
    level=1 
    count=0 
} 
... 

非常感謝的人誰幫助。