awkの/RE/と「RE」

awkの/RE/と「RE」

awk、関数の最初のパラメータ、関数の2番目のパラメータ、およびオプションの3番目のパラメータは拡張正規表現です。sub()gsub()match()split()

これらの引数は、正規表現または正規表現定数として解釈される文字列として評価される任意の式です。

では、awk特定の正規表現(構文の「タグ」)に対して正規表現定数が作成されました。/RE/REEREawk

質問:同じままであると仮定すると、RE(一部の変数ではなく正規表現)呼び出しで使用するものと構文で「タグ」を/RE/使用すること"RE"との間に実質的な違いはありますか?STRINGまたは:上記の関数を呼び出すときに正規表現を表す2つの方法を区別できる既知の実装はありますか?awksub()awk

要求された理由は、呼び出しでawk正規表現として使用したいコードをいくつか変更する必要があることを覚えているからです。またはを使用して関数を呼び出さない限り、何らかの理由で現在の実装が誤った操作を行ったためです。"RE"sub()gsub()awk/RE/

残念ながらこれはずっと前(2年前)だから詳細は覚えておらず、当時私がどんなUNIX(おそらくOpenBSD)を使っていたのかは分かりませんが、使い続けていました。この質問をしたいと思います。

答え1

はい、すべてのawk実装でこれらの違いは、バックスラッシュをエスケープ文字として使用することです。バラよりhttps://www.gnu.org/software/gawk/manual/gawk.html#Compulated-Regexpsこれについて詳しくは、次をご覧ください。

...スラッシュで囲まれた正規表現定数と二重引用符で囲まれた文字列定数の間には違いがあります。文字列定数を使用するには、文字列がデフォルトで2回検索されることを理解する必要があります。最初は awk がプログラムを読み込み、2 番目は awk の左側の文字列と一致します。右のパターンを持つ演算子です。これは、文字列定数だけでなく、すべての文字列値式(たとえば、前の例で示したdigits_regexp)にも当てはまります。

文字列を2回スキャンするとどのような違いがありますか?答えはエスケープシーケンス、特にバックスラッシュに関連しています。文字列内の正規表現にバックスラッシュを追加するには、2つのバックスラッシュを入力する必要があります。

たとえば、/\*/リテラル正規表現定数です*。バックスラッシュが1つだけ必要です。文字列で同じことを行うには、を入力する必要があります"\\*"。最初のバックスラッシュは2番目のバックスラッシュをエスケープして、文字列に実際に2つの文字を\含めることができます*

したがって、正規表現を作成するときに考慮すべき唯一のことは、次の場合では"RE"ありません/RE/

  1. REには/sが含まれており、エスケープ文字がないため、簡潔に書くのではなく、次のように書くsub("/foo/bar","")ことsub(/\/foo\/bar/,"")ができます。
  2. 接続には文字列区切り文字が必要です。var=17; sub("stuff" var,"")

/それ以外の場合は、常に文字列区切り文字()の代わりに正規表現区切り記号()を正規表現の周りに使用してください"

関連情報