1

次のような変数を含む多くのファイルがあります

{$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 などを使用) があれば、それで問題ありません。

どうもありがとう!

4

2 に答える 2

2

これを試してください:

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

match() が 0 を返したとき、つまり行に他の "{foo$bar}" 文字列が含まれていないとき、サイクルは終了します。substr() を使用して、一致するかどうか既にスキャンされた行の部分を削除しました。

于 2010-12-31T17:43:22.303 に答える
0

一致で貪欲でない正規表現を使用してみてください (http://www.exampledepot.com/egs/java.util.regex/Greedy.html)。おそらくうまくいきませんが、単なるアイデアです。

于 2010-12-31T17:17:31.210 に答える