Path: sran124!katsu From: katsu@sra.co.jp (WATANABE Katsuhiro) Message-ID: Date: 4 Aug 90 11:59:45 Organization: Software Research Associates, Inc.,Japan In-reply-to: kono@csl.sony.co.jp's message of 3 Aug 90 19:36:30 GMT Newsgroups: fj.questions.misc Subject: Re: Q : (00:01) -> 00 01 with awk (In Japanese/k) Distribution: fj References: <227@hdkuc1.hdkuc1.himeji-du.ac.jp> <12002@socslgw.csl.sony.co.jp> > > awk で、例えば(00:01)という文字列を00 01 にするにはどうすればよいでしょうか? に関して、記事 <12002@socslgw.csl.sony.co.jp> で kono@csl.sony.co.jp (Shinji Kono) さんいはく > perlがトレンディ > #!/usr/bin/perl > while (<>) { > if (/([0-9]+):([0-9]+)/) { > print "$1 $2¥n"; > } else print; > } 河野さんは説明のためにわざと素朴な例をお出しになりましたが、普通は perl -p -e 's/¥((¥d+):(¥d+)¥)/$1 $2/' です。(「(」も取り払うものと解釈しました。) > sedで十分という説ももちろんありますが… > sed -n -e 's/¥([0-9][0-9]¥)*:¥([0-9][0-9]¥)*/¥1 ¥2/' * の位置が独特ですね。それに -n だったら p などが必要でしょう。 「(00:01)」を「00 01」にしたいとのことですから、そのまま素直に、 sed 's/(¥([0-9]*¥):¥([0-9]*¥))/¥1 ¥2/' と書くべきではないでしょうか。 そもそも「awk でやりたい」とのことなんですから、 #!/bin/awk -f { openp = index($0, "("); colon = index(substr($0, openp + 1), ":"); closep = index(substr($0, openp + colon + 1), ")"); if (openp && colon && closep) { printf("%s%s %s%s¥n", ¥ substr($0, 1, openp - 1), ¥ substr($0, openp + 1, colon - 1), ¥ substr($0, openp + colon + 1, closep - 1), ¥ substr($0, openp + colon + closep + 1)) } } とかやればいいのだと思います。 しかしながら、本当にやりたいのは sed のまねごとなんかじゃなくて、 % last | awk '{ if (i = index($0, "(")) { ¥ print $1, substr($0, i + 1, 2), substr($0, i + 4, 2)}}' みたいなところなのでしょうね。 awk の解説書としては、 「プログラミング言語AWK」A. V. Aho, B. W. Kernighan, P. J. Weinberger 足立高徳訳;(株)トッパン;ISBN4-8101-8008-5 がいいとおもいます。 -- ----____----____ 渡邊克宏 SRAソフトウェア工学研究所