awk и извлечение определенного поля более одного раза - PullRequest
1 голос
/ 31 декабря 2010

У меня есть много файлов с переменными, такими как

{$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 ]

2 голосов
/ 31 декабря 2010

Попробуйте это:

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

Цикл заканчивается, когда match () возвращает 0, то есть когда строка не содержит никаких других строк "{foo $ bar}"; Я использовал substr (), чтобы удалить часть строки, которая уже была проверена на совпадения.

0 голосов
/ 31 декабря 2010

Попробуйте использовать в матче не жадное регулярное выражение (http://www.exampledepot.com/egs/java.util.regex/Greedy.html). Возможно, не сработает, но просто идея.

...