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

[osx-users:0929] Re: awk での置換について



ぐるり@プログラムはsed/awkから入った人です。

> # 何かベタすぎる気がするので、もっとスマートなやり方があったら
> # 教えて下さい。> グルやウィザードな方々

グルでもウィザードでもないただのぐるりですが解説してみましょう。

[osx-users:0923]で大西さん曰く:
> {gsub("([^0][0-9][0-9]+)" ,"0\1)";print}

そもそもこれが間違っているんではないでしょうか。
まず、awkのsub/gsubの第1引数は正規表現で、これは//で囲まれます。が、これ
はいいでしょう。""で囲んだって一応動きます。"を使うとき問題になるけど(\"
にすればいいんですけどね)。
問題は第2引数です。これは文字列で、第1引数で与えた正規表現にマッチした文
字列と入れ替えられるものです。大西さんは、\1を「第1引数で()で囲みグルー
プ化したもの」が入ることを期待して使用しているのだと思いますが、awkでこ
れは使えません。awkでは、「第1引数の正規表現にマッチした文字列」が入るス
ペシャルキャラクタ&が使えます(というかそれしか無いと言うか)。なお、&を入
れたいときは\\&とします。
第3引数は置換を行う文字列を格納している何かを指定します。フィールドを指
定してもいいし、変数でもいいです。省略したときは$0が使われるのはご承知か
と思います。

で、,をフィールド区切り文字としたときの第24フィールドが電話番号であるな
らば、以下のスクリプトでうまく行くはずです。taraiさんが[osx-users:0926]
で書かれたようにFSとOFSに,を指定して処理を開始することにしましょう。

BEGIN{
FS=","
OFS=","
}
{
sub(/^[1-9][- 0-9]+$/,"0&",$24)
#この正規表現は
#「先頭が0以外の数字で、それ以降は-,スペース,数字のみ」
#というフィールドにマッチします。
print
}

もし各フィールドの値の前後に"が付いていてかつこれを外したくならばsubを2
回使います。

sub(/^"[1-9][- 0-9]+"$/,"0&",$24)
sub(/^0"/,"\"0",$24)

とすればよいでしょう。これはフィールドが"90 1234-5678"のような形になって
いるのを、一度0"90 1234-5678"という形式になることを許し、先頭に出現する
0"を"0に置き換えることで"の外側に0が付いてしまうのを回避しています。

ちなみに俺ならperl使います:-)

perl -pe's/,([1-9][- \d]+),/,0$1,/;' in > out
#"無しの場合
perl -pe's/,"([1-9][- \d]+)",/,"0$1",/;' in > out
#"有りの場合
perl -pe's/,("?)([1-9][- \d]+)("?),/,${1}0$2$3,/;' in > out
#両方に対応

こんな感じですかね?

ところで\1と$1の差って何だろう?この場面だと同じと考えていいのだろうか?
\1だと${1}みたいな書き方が出来ないというのはわかるんですけどねえ。
-- 
ぐるり<mailto:gururi@xxxxxxxxxx> / ぐるりうぇぶ<http://gururi.com/>
OME<http://mac-ome.jp/> / blog<http://slashdot.jp/~Gururi/journal/>
PGPPublicKey URL = http://gururi.com/PGP/Gururi.pgpkey
PGPFingerPrint = 3B9E 8597 981F F603 5627  F0AE E85B 8175 797A B654

--[PR]------------------------------------------------------------------
┏━┯━┯━┯━┯━┓ 最新情報もりだくさん! ┏━┯━┯━┯━┯━┓
┃★│星│占│い│★┣━┯━┯━┯━┯━┯━┯━┫■│壁│ │紙│■┃
┗━┷━┷━┷━┷━┫⇒│ニ│ュ│ー│ス│速│報┣━┷━┷━┷━┷━┛
          ┗━┷━┷━┷━┷━┷━┷━┛
 mypopで毎日お届け => http://click.freeml.com/ad.php?id=167197
------------------------------------------------------------------[PR]--
<GMO GROUP> Global Media Online  www.gmo.jp