• 締切済み

Shift_JIS漢字を削除したい

Shift_JISファイルの中の漢字を削除したいですが、 以下のスクリプトがうまく行きません(なにも削除してくれない)。 while ( <IN> ) { chomp(); tr/[\x81-\x9F][\x40-\xFC]//; tr/[\xE0-\xEF][\x40-\xFC]//; print OUT "$_\n"; } どう書けばよいでしょうか?

みんなの回答

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

本当に「文字単位でマッチしている」んだったら, いくらバイト表現しても無駄です. つまり, 文字単位でマッチするときには s/[\x81-\x9F][\x40-\xFC]//g; は「文字コードが 0x81~0x9F の文字」の直後に「文字コードが 0x40~0xFC の文字」が来るパターンを削除します. でも, Shift_jis にはそんな文字はないのでこの正規表現は無意味ですよね. スクリプトを Shift_jis で書いて, s/ぁ-ん//g; とやったらひらがなが消えたりして.

pokk2007
質問者

補足

[\x81-\x9F][\x40-\xFC]は二つの文字とされることでしょうか? x9F40はひとつの漢字を表わしていると思いますが、これを削除するのにどう書けばよいでしょうか?

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

本当にバイトごとにマッチしてますか? 前後がないので全く分からないんですが, 実は文字単位でマッチしてたりしませんか?

pokk2007
質問者

お礼

おっしゃる通り、以下のスクリプトはバイトごとではなく、文字単位となっていると思います。 tr/0-9a-zA-Z\-\'\:\.\,\!\? //cd; しかし、以下のようにバイト表現でいろいろ試したが、 s/[\x81-\x9F][\x40-\xFC]//g; s/[\xE0-\xEF][\x40-\xFC]//g; どうしても反応してくれません。 たぶん、このスクリプトの問題ではなく、前後その他の部分の問題かもしれませんね。 他の部分を注目してもう少しテストしてみます。

  • t-okura
  • ベストアンサー率75% (253/335)
回答No.2

> s///g でもNGでした。やはり何も削除されませんでした。 えぇっと、まさか s///g とそのまま書いていないでしょうね。 s/[\x81-\x9F][\x40-\xFC]//g; s/[\xE0-\xEF][\x40-\xFC]//g; などに直してますよね(^^)。 それと、IN, OUT は、どこかでオープンしていますよね。 標準入力、標準出力を使うのでしたら、それぞれ <> と、 print "$_\n"; でよく、IN, OUT はいらないです。

pokk2007
質問者

お礼

t-okuraさん もちろん以下の通り書いていました。 s/[\x81-\x9F][\x40-\xFC]//g; s/[\xE0-\xEF][\x40-\xFC]//g; なにも削除してくれません(泣~) IN,OUTはテキストファイルを読み込んでます。 面倒くさいから、以下で無理やりに対応しました。 tr/0-9a-zA-Z\-\'\:\.\,\!\? //cd; とりあえず、一段落と致します。 ありがとうございました。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

えぇと, tr の意味は理解されてますでしょうか? バイトごとにマッチするなら s///g でいけると思う.

pokk2007
質問者

補足

s///g でもNGでした。やはり何も削除されませんでした。

関連するQ&A