awk并不止一次提取特定字段

时间:2010-12-31 16:30:31

标签: awk gawk

我有很多带有变量的文件,比如

{$var1} some text {$var2} some other text

我想把它们给awk,以便awk提取它们并给出这样的结果:

file_name.htm - 8 : {$title}
file_name.htm - 10 : {$css_style}
file_name.htm - 33 : {$img_carte_image_02_over}

这个awk脚本是一块蛋糕:

#!/usr/bin/gawk -f
BEGIN { }
match($0, /({.*\$.+})/, tab) {
  for (x=1; tab[x]; x++) {
    print FILENAME" - "FNR" : "substr($0, tab[x, "start"], tab[x, "length"])
  }
}
END { }

我这样称呼它:

find website/ | grep -E '(html|htm)$' | xargs ./myh.sh | more

除非多个变量在同一行上,否则一切正常。在这种情况下,我得到:

file_name.htm - 59 : {$var1}<br/>{$var2}

而我想:

file_name.htm - 59 : {$var1}
file_name.htm - 59 : {$var2}

知道我应该/应该怎么做? 当然,如果你有另一个解决方案(有sed或其他什么),对我来说没问题!

非常感谢!

2 个答案:

答案 0 :(得分:2)

试试这个:

awk '{
    line=$0; 
    while (match(line,/({[^$]*\$[^}]+})/)){
        print FILENAME,"-",FNR,":",substr(line,RSTART,RLENGTH);
        line=substr(line,RSTART+RLENGTH+1)
    }
}'

当match()返回0时,循环结束,即当line不包含任何其他“{foo $ bar}”字符串时;我使用substr()删除已经扫描过匹配的行的部分。

答案 1 :(得分:0)

尝试在匹配中使用非贪婪的正则表达式(http://www.exampledepot.com/egs/java.util.regex/Greedy.html)。可能不起作用,但只是一个想法。