awkプログラミング言語で
一致式でのような引用符付きの文字列は、
"^[0-9]+$"
スラッシュで囲まれた正規表現と同じ意味で使用されることがよくあります/^[0-9]+$/
。しかし、1つの例外があります。引用符付き文字列が正規表現メタ文字のリテラル発生と一致する場合は、バックスラッシュ自体を保護するために追加のバックスラッシュが必要です。それは、$0 ~ /(\+|-)[0-9]+/
そして
$0 ~ "(\\+|-)[0-9]+"
同等です。
これは奇妙に思えるかもしれませんが、awkが引用符付き文字列を解析するときに保護バックスラッシュ階層を削除するために発生します。正規表現で特別な意味を閉じるためにメタ文字の前にバックスラッシュを付ける必要がある場合は、文字列内でそれを保護するためにバックスラッシュの前にバックスラッシュを付ける必要があります。
一致演算子の右側のオペランドが次の変数またはフィールド変数の場合
X ~ $1
これにより、バックスラッシュはデータに特別な意味を持たないため、最初のフィールドに追加のバックスラッシュは必要ありません。
最後の文はどういう意味ですか?
「バックスラッシュはデータに特別な意味がないため、最初のフィールドに追加のバックスラッシュが必要ない」理由は何ですか?
ありがとうございます。
答え1
その意味はデータ相対的な絶え間ない"abc"
または88
は awk プログラムに表示される定数ですが、awk 変数にはデータが含まれているか、入力から読み取られたデータが含まれます。データは解析されませんが、awkプログラムのテキスト本文の定数は解析されます。/a|b/
$0
x+y...z
1以上の入力と一致させるためにy
正規表現が必要ですが、エスケープする必要があるとします。それ以外の場合は+
1以上を意味しますx
。したがって、次のいずれかを使用できます。
awk 'BEGIN{ a = "x\\+y+z"; print a }
NR==1{ b = $0; print b; next }
$0 ~ a {print "match a " $0 }
$0 ~ b {print "match b " $0 }
$0 ~ /x\+y+z/ {print "match 2 " $0 }
$0 ~ "x\\+y+z" {print "match 3 " $0 }
' <<\!
x\+y+z
x+yyyyz
!
最後の4行はすべて同じ内容に一致すると印刷します。たとえば、変数のデータ値が定数で解析されたことをx+yyyyz
示すことは、入力データの最初の行から変数の解析されていないデータ値を読み取るのと同じです。式 数式定数と文字列定数は同じ形式です。print a
a
x\+y+z
print b
b