2012-04-20 10 views
7

パターンと同じ動作をして、入力レコードの一部にアクセスすることがよくあります。一致したグループにアクセスする方法はありますか?

/^Compiled from \"(.*)\"$/ { 
    file_name = gensub("^Compiled from \"(.*)\"$", "\\1", "g"); 
    print file_name; 
} 

したがって、正規表現マッチングは2回実行されます。もう一度マッチングすることなく、アクションで\\1にアクセスする方法はありますか?

私はパターンマッチングと余分なコードの両方を減らそうとしています。

+0

は思わ:http://stackoverflow.com/questions/2957684/awk-access-captured-group-from-line-pattern – Slartibartfast

+0

@Slartibartfastことができます。私は投稿する前にその質問を見つけられなかったので、ありがとう。それでも、[これ(http://stackoverflow.com/a/4673336/18573)の回答として、私は 'match($ 0 ....')を使用しなければなりません。実際にはまだ –

答えて

7

残念なことに、GAWKは、//を使用するsedのキャリーフォワード機能を備えていません。

sed '/\(patt\)ern/ {s//new\1/}' inputfile 

しかし、変数が最近発明されているので、あなたは喜ぶことができ、彼らはただ、この目的のために使用することができます!ここでの答えのように

BEGIN { 
    pattern = "^Compiled from \"(.*)\"$" 
} 
$0 ~ pattern { 
    file_name = gensub(pattern, "\\1", ""); 
    print file_name; 
} 
+0

でした変数を使用していますが、私の質問に答えてこれを受け入れています。 –

関連する問題