awk并多次提取特定字段

awk并多次提取特定字段,awk,gawk,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} find website/ | grep -E '(html|htm)$' | xargs ./my

我有很多文件,里面有变量,比如

{$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}
find website/ | grep -E '(html|htm)$' | xargs ./myh.sh | more
这个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 { }
我这样称呼它:

file_name.htm - 8 : {$title}
file_name.htm - 10 : {$css_style}
file_name.htm - 33 : {$img_carte_image_02_over}
find website/ | grep -E '(html|htm)$' | xargs ./myh.sh | more
除了多个变量在同一条线上,其他一切都正常工作。在这种情况下,我得到:

file_name.htm - 59 : {$var1}<br/>{$var2}
你知道我该怎么做吗? 当然,如果你有另一个解决方案(使用sed或其他什么),我也可以


非常感谢

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

试试这个:

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

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

您能否发布一个awk输入行示例(至少一个好,一个坏)?
match
填充的数组包含每个捕获组的一个条目
()
,而不是正则表达式匹配的每个子字符串。在你的例子中,它实际上匹配了大部分行,因为正则表达式是贪婪的。请参阅马可答案中的正则表达式,了解锚定它的技术。请注意,如果在
BEGIN
END
中没有执行任何操作,则可以忽略它们。AWK不知道如何执行非贪婪操作。