[ubuntu-jp:6137] Re: sed の正規表現

Kenzi NOIKE knoike @ gmail.com
2019年 3月 3日 (日) 12:33:00 UTC


野池です.

「仮想マシンに Ubuntu 環境を用意して LC_COLLATE ファイルの中を見てみよう」
かと思っていたところ,KUBO さんから私個人宛てメールで,
「文字の並び順の話だけであれば sort を使った調べ方でもよいかもしれない」と
具体的な方法とともに教えていただきました.
ありがとうございます.思いつきませんでした.

その方法で調べた,LC_COLLATE=C.UTF-8 のときの並び順は

ぁ < ゞ < ・ < ゟ

だとわかりました.なるほど!
「ゞ」と「ゟ」は文字コードどおりに連続しているものと思い込んでいました.
「ゞ」と「ゟ」の間に「・」が位置していたのですね.
LC_COLLATE 指定では,濁点文字と半濁点文字くらいしか
順序が変わらないものかと思いこんでいました.
そもそも,LC_COLLATE=C系の指定で,もともとの文字コード順から
こんなに変わるとは思ってもみませんでした.
もし,「指定した文字エンコーディングでの文字コード順にしてくれる」と
思い込んだままでしたら,何かの実装のときに大ポカをしたかもしれません.

元質問者の吉永さんの疑問である事の経緯はわかりませんが,これで,

> [ゞ-ゟ] に含まれる.
> [ぁ-ゟ] に含まれる.
> [ぁ-ゞゟ] には含まれない.

の理解が私にもできます.
LC_COLLATE=C.UTF-8 下では,
[ぁ-ゟ] と [ぁ-ゞゟ] は異なる範囲を表していたのですね.



2019年3月2日(土) 22:10 Kenzi NOIKE <knoike @ gmail.com>:
>
> 野池です.
> Takahashiさん,どうもありがとうございます.
> そのような仕組みになっているのですね.了解いたしました.
>
> ただ,吉永さんの調査結果を整理すると,
>
> [ゞ-ゟ] に含まれる.
> [ぁ-ゟ] に含まれる.
> [ぁ-ゞゟ] には含まれない.
>
> とのことですので,「・」がどこに位置しているのか,いまも想像がつきません... .
>
>
> > > $ echo ・ | LC_COLLATE=C.UTF-8 sed -r 's/[ゞ-ゟ]/かな/'
> > としても同じですが
> > > $ echo ・ | LC_COLLATE=C.UTF-8 sed -r 's/[あ-ゞゟ]/かな/'
> > は大丈夫なので、「ゟ」まで跨る書き方だと「・」が含まれてしまいます
>
> > $ echo "・" | LC_COLLATE=C.UTF-8 grep "[ぁ-ゟ]"
> > はヒットして期待外の動作ですが
> > $ echo "・" | LC_COLLATE=C.UTF-8 grep "[ぁ-ゞゟ]"
> > はヒットしませんね
>
>
>
> 2019年3月2日(土) 22:00 Masakazu Takahashi <emasaka @ gmail.com>:
> >
> > こんにちは。
> >
> > 私もよく知らないのですが、LC_COLLATE はたとえば
> >
> > abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
> >
> > や
> >
> > aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ
> >
> > のように、文字の並び順そのものを定義していたかと思います。
> >
> > そのため、理論上はどんな並び順も作りえるかと。
> >
> > On Sat, Mar 2, 2019 at 9:48 PM Kenzi NOIKE <knoike @ gmail.com> wrote:
> > >
> > > 野池です.
> > >
> > > > ぁ < ゟ < ・ < ゞ
> > >
> > > すみません,ヒットしないのですから,この大小関係は間違いですね.
> > > 慌てていて申し訳ないです.
> > >
> > >
> > > > $ echo "・" | LC_COLLATE=C.UTF-8 grep "[ぁ-ゟ]"
> > > > はヒットして期待外の動作ですが
> > > > $ echo "・" | LC_COLLATE=C.UTF-8 grep "[ぁ-ゞゟ]"
> > > > はヒットしませんね
> > >
> > > この現象を説明できる,ぁ, ゞ, ゟ と ・ の大小関係の想像がつきません... .
> > >
> > >
> > >
> > >
> > > 2019年3月2日(土) 21:41 Kenzi NOIKE <knoike @ gmail.com>:
> > > >
> > > > 野池です.すみません,ほぼ興味本位の質問になってしまうので,
> > > > どなたでもわかる方に教えていただきたいのですが... .
> > > >
> > > > Takahashiさんの実験結果からすると,LC_COLLATE の定義に起因してそうには思うのですが,
> > > >
> > > > > $ echo "・" | LC_COLLATE=C.UTF-8 grep "[ぁ-ゟ]"
> > > > > はヒットして期待外の動作ですが
> > > > > $ echo "・" | LC_COLLATE=C.UTF-8 grep "[ぁ-ゞゟ]"
> > > > > はヒットしませんね
> > > >
> > > > C.UTF-8 での LC_COLLATE の定義が原因だとすると,
> > > > この現象が理解できないのですが,定義次第でこのようなことが起きるのでしょうか?
> > > > ぁ, ゞ, ゟ と ・ の大小関係の想像がつきません.
> > > >
> > > > もしかして,非日本語圏の方には「ゞ」は濁点つきの文字と理解されていて,
> > > > 大きなコードが割り当てられていて,
> > > >
> > > > ぁ < ゟ < ・ < ゞ
> > > >
> > > > となっている,という状況でしょうか???
> > > > この妙な大小関係が当たっているとすると,
> > > > [ぁ-ゞゟ] は,実際は [ぁ-ゞ] に含まれてしまっていることになるので,
> > > > 確かに起こっている現象の説明はつくのですが,C.UTF-8 の LC_COLLATE が,
> > > > 元の文字コード順を劇的に入れ替えているとは思いづらいです... .
> > > >
> > > >
> > > >
> > > > 2019年3月2日(土) 21:01 Yoshinaga Hiroyuki <yoshinaga.hiroyuki @ nifty.com>:
> > > > >
> > > > > On Sat, Mar 02, 2019 at 07:15:43PM +0900, Masakazu Takahashi wrote:
> > > > > > 原因まではわかりませんが、これは sed ではなく GNU libc、特にその中の
> > > > > > ロケール定義の違いによる挙動ではないでしょうか。
> > > > > >
> > > > > > ためしに Ubuntu 16.04 用の libc-bin パッケージをダウンロードして
> > > > > > /usr/lib/locale/C.UTF-8/LC_COLLATE ファイルを抜き出し、Ubuntu 18.10 に
> > > > > > 持ってきて上書きしてみたら、Ubuntu 16.04 の挙動になりました。
> > > > > 16.04 の環境がないので、同じこと確認できませんでしたが、
> > > > > $ echo "・" | LC_COLLATE=C.UTF-8 grep "[ぁ-ゟ]"
> > > > > はヒットして期待外の動作ですが
> > > > > $ echo "・" | LC_COLLATE=C.UTF-8 grep "[ぁ-ゞゟ]"
> > > > > はヒットしませんね
> > > > >
> > > > > 仰るように sed 固有ではなく GNU ツール共通のようですね
> > > > >
> > > > > --
> > > > > -^.~.^-   吉永博之
> > > > > ~= ^ =~-  yoshinaga.hiroyuki @ nifty.com
> > > > >  ^ ~ ^ ~
> > > > >
> > > >
> > > >
> > > > --
> > > > // Kenzi NOIKE
> > >
> > >
> > >
> > > --
> > > // Kenzi NOIKE
> >
> >
> >
> > --
> > Masakazu Takahashi (emasaka)
>
>
>
> --
> // Kenzi NOIKE



-- 
// Kenzi NOIKE


ubuntu-jp メーリングリストの案内