web-dev-qa-db-ja.com

GNU awk:置換テキストでキャプチャされたグループにアクセスする

これは単純なように見えるはずですが、awk gensub/gsub/subの動作は常に私には不明確でしたが、今では、ドキュメントに書かれているとおりに(そして何億もの経験を)実現させることができません他の同様のツールが機能することを示唆しています)。具体的には、置換文字列の正規表現から「キャプチャされたグループ」にアクセスしたい。 awkの構文は次のようになります。

awk '{ gsub(/a(b*)c/, "Here are bees: \1"); print; }'

これにより、「abbbc」が「Here are bees:bbb」に変わります。 Ubunutu 9.04では、少なくとも私にとってはそうではありません。代わりに、「\ 1」は^ Aとしてレンダリングされます。つまり、コード1のキャラクターです。もちろん、私が望むものではありません。どうすればよいですか?

ありがとう。

30
Pointy
echo abbc | awk '{ print gensub(/a(b*)c/, "Here are bees: \\1", "g", $1);}'

マニュアルを参照 こちら gsubとgensubの違いを確認する

26
user180100

Gawkマニュアルごと

gensubは、subまたはgsubでは使用できない追加機能を提供します。置換テキストで正規表現のコンポーネントを指定する機能です。これは、正規表現で括弧を使用してコンポーネントをマークし、置換テキストで「\ N」を指定することによって行われます。ここで、Nは1から9までの数字です。

Gensubを使用する必要があり、「g」を指定する必要があります。また、gensubはインプレースで変更されないため、resultを取得する必要があります。

awk '{ r = gensub(/a(b*)c/, "Here are bees: \\1", "g"); print r; }'
24