Domanda

devo molti file con le variabili in loro come

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

mi piacerebbe dare loro di awk in modo che gli estratti awk loro e dà un risultato come questo:

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

Questo è un pezzo di torta con questo script 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 { }

sto chiamando in questo modo:

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

Tutto funziona bene, tranne quando le variabili sono multipli sulla stessa linea. In questo caso ottengo:

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

mentre io voglio:

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

Qualsiasi idea di come avrei potuto / dovuto fare? Naturalmente se si dispone di un'altra soluzione (con sed o qualsiasi altra cosa) Va bene per me!

Grazie mille!

È stato utile?

Soluzione

Prova questo:

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

Le estremità del ciclo quando match () restituisce 0, cioè quando la linea non contiene alcuna altra "{foo $ bar}" stringhe; Ho usato substr () per rimuovere la parte della linea che è stato già sottoposto a scansione per le partite.

Altri suggerimenti

Provare a usare un'espressione regolare non avido nel match (http://www.exampledepot.com/egs/java.util.regex/Greedy.html). Probabilmente non funzionerà, ma solo un'idea.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top