Frage

Ich habe viele Dateien mit Variablen in ihnen wie

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

Ich möchte sie awk geben, damit AWK sie extrahiert und ein Ergebnis wie dieses gibt:

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

Dies ist ein Kinderspiel mit diesem awk -Skript:

#!/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 { }

Ich nenne es so:

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

Alles funktioniert einwandfrei, außer wenn mehrere Variablen in derselben Zeile sind. In diesem Fall bekomme ich:

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

Während ich will:

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

Irgendeine Idee, wie ich tun sollte/sollte? Natürlich, wenn Sie eine andere Lösung haben (mit SED oder was auch immer), ist es für mich in Ordnung!

Danke vielmals!

War es hilfreich?

Lösung

Probier diese:

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

Der Zyklus endet, wenn match () 0 zurückgibt. Dann enthält die Linie keine anderen "{foo $ bar}" -Saiten; Ich habe Substr () verwendet, um den Teil der Linie zu entfernen, der bereits nach Übereinstimmungen gescannt wurde.

Andere Tipps

Versuchen Sie, eine Nicht-Greedy-Regex in der Match zu verwenden (http://www.exampledepot.com/egs/java.util.regex/greedy.html). Wahrscheinlich wird nicht funktionieren, aber nur eine Idee.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top