gsub() を式として使う
なかなかダークな世界の話題です。
以下のファイルの
<br><br>
より前を抽出するという問題ですが、完全に gsub() / sub() の評価式問題に置き換わっています。
this is a message<br><br> ignore me this is also a message a little longer<br><br>ignore me hello<br><br> this is a message
BEGIN{FS="<br><br>"}{print $1}
とか、
gsub(/<br><br>.*/,"")&&1
までは良かったのですが、例によって Ed Morton が以下の例を出したことから始まりました。
sub(/<br><br>.*/,"")1
これって、連接ということでいいんですよね。(^^;
同様に以下のものでも一緒じゃないかという議論に進みます。
sub(/<br><br>.*/,"")&&1
sub(/<br><br>.*/,"")||1
sub(/<br><br>.*/,"")+1
sub(/<br><br>.*/,"")>=0
sub(/<br><br>.*/,"")0
例文に必ず
<br><br>
が入っているから、同じなのですが、入っていない場合結果が異なることを William James が指摘しています。
少し例文を変えてみましょう。
this is a message<br><br> ignore me Hello.
面倒なので、以下のような Makefile を用意します。
$ cat Makefile INFILE = test.txt ALL: gawk 'sub(/<br><br>.*/,"")' $(INFILE) gawk 'sub(/<br><br>.*/,"")0' $(INFILE) gawk 'sub(/<br><br>.*/,"") 0' $(INFILE) gawk 'sub(/<br><br>.*/,"")+0' $(INFILE) gawk 'sub(/<br><br>.*/,"")1' $(INFILE) gawk 'sub(/<br><br>.*/,"") 1' $(INFILE) gawk 'sub(/<br><br>.*/,"")&&1' $(INFILE) gawk 'sub(/<br><br>.*/,"")||1' $(INFILE) gawk 'sub(/<br><br>.*/,"")+1' $(INFILE)
実行してみます。
$ make gawk 'sub(/<br><br>.*/,"")' test.txt this is a message gawk 'sub(/<br><br>.*/,"")0' test.txt this is a message Hello. gawk 'sub(/<br><br>.*/,"") 0' test.txt this is a message Hello. gawk 'sub(/<br><br>.*/,"")+0' test.txt this is a message gawk 'sub(/<br><br>.*/,"")1' test.txt this is a message Hello. gawk 'sub(/<br><br>.*/,"") 1' test.txt this is a message Hello. gawk 'sub(/<br><br>.*/,"")&&1' test.txt this is a message gawk 'sub(/<br><br>.*/,"")||1' test.txt this is a message Hello. gawk 'sub(/<br><br>.*/,"")+1' test.txt this is a message Hello.
末尾に '0' が付いた部分を見ても分かるように、連接で動いているようです。
'+0' の処理の場合には、数値化されて '0' になります。