[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[debian-users:26981] Re: sub()/gsub() error in gawk-ja



こんにちは。松田陽一@PAL-NET三鷹です。

From: Fumitoshi UKAI <ukai@debian.or.jp>
Subject: [debian-users:26980] Re: sub()/gsub() error in gawk-ja
Date: Fri, 16 Feb 2001 16:04:43 +0900

> At Fri, 16 Feb 2001 15:46:09 +0900,
> MATSUDA Yoh-ichi / 松田陽一 wrote:
> 
> > 日常使用している gawk-ja なんですが、 sub() 及び gsub() の実装に
> > 不具合と思われる挙動を発見しました。
> 
> gawk-ja は知りませんが、これは mawkとgawkでの
> 文字列定数の中での \ エスケープの仕様の違いっぽいですが。
> 
>  % echo | mawk '{print "\&";}'
>  \&
> 
> # mawk(1)より
> # Data types, conversion and comparison
> #   If you escape any other character \c, you  get  \c,  i.e.,
> #       mawk ignores the escape.
> 
>  % echo | gawk '{print "\&";}'
>  &
>  % echo | gawk '{print "\\\&";}'
>  \&
> 
> # gawk(1)より
> #  String Constants
> #     \c   The literal character c.
> 
> で、awk では & はマッチした文字列とおきかわるので
>  
> > hoge:~/work$ echo ">"|mawk "{sub(/>/,\"\&gt;\");print}"
> > &gt;
> > hoge:~/work$ echo ">"|gawk "{sub(/>/,\"\&gt;\");print}"
> > >gt;
> 
> となります。
> # gawk では escapeをはずされると />/を &gt; で subすることになるので
> # & はマッチした > になって 結果 >gt; になる。
> 
> 以下のようにすると
>  % echo ">"|gawk '{print "\\\&gt";}'
>  &gt;
> となります。

げ、バックスラッシュ 3つなんて、そんなぁ…

だとすると、 man gawk での

| gsub(r, s [, t]) for  each  substring  matching the
|                  regular expression r in the string
|                  t,  substitute  the  string s, and
|                  return  the  number  of  substitu-
|                  tions.   If t is not supplied, use
|                  $0.  An & in the replacement  text
|                  is replaced with the text that was
|                  actually matched.  Use \& to get a
                                      ^^^^^^^^^^^^^^^
|                  literal  &.  See AWK Language Pro-
                   ^^^^^^^^^^
|                  gramming for a  fuller  discussion
|                  of  the  rules  for  &'s and back-
|                  slashes in the replacement text of
|                  sub(), gsub(), and gensub().

この記載は嘘だってことになりませんか?

> > BTS に出すべきでしょうか?
> > 
> > # 出し方を知らないんですが…(汗)
> 
>  http://bugs.debian.org/ を見ましょう:)
> # 例えば reportbug を使うとか。

ポインタありがとうございます。
これが「仕様」ということで片付けられてしまうならば、出すのは
止めておきますが、今後利用する可能性が考えられますので、後々
の参考にします。
--
♪ねぇ、雪が降るまえに。
松田 陽一(yoh)
mailto:matsuda@xxxxxxxxxxxx
http://www2.palnet.or.jp/~matsuda/index.htm