[ubuntu-jp:6128] Re: sed の正規表現
toshiaki koike
t-k @ xf.pinoko.jp
2019年 2月 28日 (木) 12:28:10 UTC
小池と申します。
最近不活性なこのMLで、かつ技術よりの話題だと誰もレスしなさそうな気がしますが…
私はもうsedは使ってないので事情はわかりませんが、Perl屋の見地から。
結論を先に書くと、18.04以降でのsed(4.5)の文字コードの内部処理問題と思われます。
$ echo ・ | LC_COLLATE=C.UTF-8 sed -r 's/[ぁ-ゟ]/かな/'
これを試してみたところ、
16.04(sed 4.2.2)では、
・
18.04(sed 4.5)では、
かな
となりました。
一方、Perlの正規表現の場合、以下のスクリプトを実行すると、
---------------------------
#!/usr/bin/perl -w
use strict;
use Encode;
use utf8;
my $str =
qq(ABCabx123123¥・*あかさたなゑゔゝゞゕゟアカサタナ);
$str =~ s/[\x{3041}-\x{309F}]//g;
print encode("utf-8",$str) ,"\n";
---------------------------
16.04でも18.04でも、
ABCabx123123¥・*アカサタナ
という結果になります。
---------------------------
#!/usr/bin/perl -w
use strict;
use Encode;
use utf8;
my $str =
qq(ABCabx123123¥・*あかさたなゑゔゝゞゕゟアカサタナ);
$str =~ s/[ぁ-ゟ]//g;
print encode("utf-8",$str) ,"\n";
---------------------------
でも同じですので、Perlの正規表現では、[ぁ-ゟ]でも[\x{3041}-\x{309F}]でも・(30FB)はその範囲外です。
さらにsedでは、
echo ・ | LC_COLLATE=C.UTF-8 sed -r 's/[\u3041-\u309F]/かな/'
を実行してみたら、16.04でも18.04でも、
・
となりました。
文字コードで範囲指定する場合は\u3041のような指定のほうが安全かもしれません。
------------------------------------
t-k @ xf.pinoko.jp 小池利明
Toshiaki Koike
------------------------------------
On 2019 2月 27日 (水), 9:03 午後, Yoshinaga Hiroyuki
<yoshinaga.hiroyuki @ nifty.com> wrote:
> Ubuntu というより、sed
> の正規表現について伺いたく投稿させてもらいます
>
>> $ lsb_release -a
>> No LSB modules are available.
>> Distributor ID: Ubuntu
>> Description: Ubuntu 18.10
>> Release: 18.10
>> Codename: cosmic
>> $ sed --version
>> sed (GNU sed) 4.5
>> Copyright (C) 2018 Free Software Foundation, Inc.
>> License GPLv3+: GNU GPL version 3 or later
>> <https://gnu.org/licenses/gpl.html>.
>> This is free software: you are free to change and redistribute it.
>> There is NO WARRANTY, to the extent permitted by law.
>>
>> 作者 Jay Fenlason、 Tom Lord、 Ken Pizzini、
>> および Paolo Bonzini。
>> GNU sed home page: <https://www.gnu.org/software/sed/>.
>> General help using GNU software: <https://www.gnu.org/gethelp/>.
>> E-mail bug reports to: <bug-sed @ gnu.org>.
> といった環境で、かな文字を対象にしようとした所、
>> $ echo ・ | LC_COLLATE=C.UTF-8 sed -r 's/[ぁ-ゟ]/かな/'
>> かな
> といった結果になります
>
> ここで使った文字のコードは次のとおりで、なぜ「・」が置換されるのか解りません
> あ 0x3041
> ゟ 0x309F
> ・ 0x30FB
>
>> $ echo ・ | LC_COLLATE=C.UTF-8 sed -r 's/[ゞ-ゟ]/かな/'
> としても同じですが
>> $ echo ・ | LC_COLLATE=C.UTF-8 sed -r 's/[あ-ゞゟ]/かな/'
> は大丈夫なので、「ゟ」まで跨る書き方だと「・」が含まれてしまいます
>
> この辺りの事情をご存知の方、ここより〜で質問したほうが良いといった情報をお待ちしています
>
> --
> -^.~.^- 吉永博之
> ~= ^ =~- yoshinaga.hiroyuki @ nifty.com
> ^ ~ ^ ~
>
-------------- next part --------------
HTMLの添付ファイルを保管しました...
URL: <https://lists.ubuntu.com/archives/ubuntu-jp/attachments/20190228/88eb8d64/attachment.html>
ubuntu-jp メーリングリストの案内