5

わかりました、簡単に言うと、ここにコードがあります。読みやすいようにコードを少しフォーマットしました。

awk '{
t=$0   ; 
$0=t   ; $0=//           ; print "$0=//           ; value of $0 is ",$0
$0=t   ; $0=/./          ; print "$0=/./          ; value of $0 is ",$0
$0=t   ; $0=/*/          ; print "$0=/*/          ; value of $0 is ",$0
$0=t   ; $0=/**/         ; print "$0=/**/         ; value of $0 is ",$0
$0=t   ; $0=/[0-9]/      ; print "$0=/[0-9]/      ; value of $0 is ",$0
$0=t   ; $0=/[a-z]/      ; print "$0=/[a-z]/      ; value of $0 is ",$0
$0=t   ; $0=/[0-9][a-z]/ ; print "$0=/[0-9][a-z]/ ; value of $0 is ",$0
$0=t   ; $0=/5/          ; print "$0=/5/          ; value of $0 is ",$0
$0=t   ; $0=/55/         ; print "$0=/55/         ; value of $0 is ",$0
$0=t   ; $0=/x/          ; print "$0=/x/          ; value of $0 is ",$0
$0=t   ; $0=/5x/         ; print "$0=/5x/         ; value of $0 is ",$0
$0=t   ; $0=/x5/         ; print "$0=/x5/         ; value of $0 is ",$0
$0=t   ; $0=/xoo/        ; print "$0=/xoo/        ; value of $0 is ",$0
$0=t   ; $0=/500/        ; print "$0=/500/        ; value of $0 is ",$0
}'<<<"5x"

私はこの出力を得ました:

$0=//           ; value of $0 is  1
$0=/./          ; value of $0 is  1
$0=/*/          ; value of $0 is  0
$0=/**/         ; value of $0 is  1
$0=/[0-9]/      ; value of $0 is  1
$0=/[a-z]/      ; value of $0 is  1
$0=/[0-9][a-z]/ ; value of $0 is  1
$0=/5/          ; value of $0 is  1
$0=/55/         ; value of $0 is  0
$0=/x/          ; value of $0 is  1
$0=/5x/         ; value of $0 is  1
$0=/x5/         ; value of $0 is  0
$0=/xoo/        ; value of $0 is  0
$0=/500/        ; value of $0 is  0

なぜこの出力が得られたのか理解できません。awk は代入ステートメントについて文句を言うだろうと思っていましたが、そうではありませんでした$0=/xxx/。つまり、?$0=/pattern/と同じです。$0=$0~/pattern/

次に、このテストを行いました:

kent$  echo "xx"|awk '{y="777";y=/x/;print y}'                                                                                                                              
1

kent$  echo "xx"|awk '{y="777";y=/7/;print y}'                                                                                                                              
0

ようです、foo=/pattern/と同じですfoo=$0~/pattern/

しかし、よくわかりません...ドキュメント/マニュアルページで情報が見つかりません。

ここ@ SOでawkの質問に答えていたときに見つけました。

awkでテストしました:

kent$  awk --version|head -1
GNU Awk 4.1.0, API: 1.0 (GNU MPFR 3.1.2, GNU MP 5.1.2)

誰かが私を説明してくれれば幸いです。前もって感謝します。

編集

さらにテストを行った後、(ドキュメントで見つけられ {...}なかったので、わかりません)が判明し/pattern/まし$0~/pattern/た。だから私たちはできる:{...}/patter/{do something}

kent$  echo "xx"|awk '{if(/x/)print "ok"}'                                                                                                                                  
ok

それが awk スクリプト構文の標準機能かどうかはわかりません。そして、それがすべての awk 実装で機能する場合。私はまだマニュアルとマニュアルページを探しています...

4

2 に答える 2

6

/regexp/の省略形です$0 ~ /regexp/

var = ($0 ~ /regexp/)比較の結果を var に割り当てます。true の場合は 1、それ以外の場合は 0 です。

$0 = ($0 ~ /regexp/)$0 と /regexp/ の比較結果を $0 に代入します

$0 = ($0 ~ //)$0 に空の文字列を検索した結果を $0 に割り当てます。これは常に存在するため、条件は真であり、結果は 1 です。

$0 = //同じことをします

$0 = /*/$0 でリテラルを探してい*ますが、存在しないため、結果はゼロです。

$0 = /**/$0 で 0 回以上繰り返されるリテラルを探してい*ます。それらはゼロであるため、結果は 1 です。

ミステリーも奇妙なものも何もない...

于 2013-09-13T21:41:43.673 に答える
2

$0の値を評価された正規表現の一致の値に設定しているだけなので、謎はありません。右側が最初に評価されます。行が正規表現に一致する場合、結果は True (つまり 1 ) になります。それ以外の場合、結果は False (つまり 0 ) になります。

于 2013-09-13T21:41:15.017 に答える