sedがgrep(およびsedとawk)のロケール照合ファイルで定義された操作を実行しないのはなぜですか?

sedがgrep(およびsedとawk)のロケール照合ファイルで定義された操作を実行しないのはなぜですか?

すべての(印刷可能な)ASCII文字を含むファイルがあります。

$ printf '%b' "$(printf '\\U%x\n' {32..126})" > file

並べ替えることができます(長い出力を1行に減らすにはtrを使用してください)。

$ sort file | tr -d '\n'
 !"#%&'()*+,-./:;<=>?@[\]^_`{|}~$0123456789aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ

en_US.utf8ロケールを使用するDebianバスターシステムに表示される照合順序(個々の文字の場合)は、最初に句読点、数字、大文字と小文字の混合順序です。つまり、aAbB、小文字、大文字が一緒に使用されます。

これが正確で、ユーザー(私)が整理したい場合であるとしましょう。

ただし、同じシステムでは、他の変更なしに次のことが発生します。

$ grep '[a-z]' file | tr -d '\n'
abcdefghijklmnopqrstuvwxyz

つまり、範囲はa-z何かによって小文字のASCII文字に変換されます。

翻訳は誰が行い、どのように制御または変更できますか?

私は小文字が何であるか、[az]が何を意味するのか、または誰かがそれが何を意味するのかを尋ねません。

[a-z]この範囲は、で始まり、で終わる範囲であると予想されます。az ソート順に

[a-z]一部の他のユーザーは、すべてのロケールで意味が「小文字」と同じであることを知っています。私はおそらく基本的に「これと一緒に暮らす」でしょう。

しかし、必要に応じてこれをどのように制御および/または変更できますか?交換可能なハンドルはどこにありますか?

いいえ、照合ファイルを変更しても役に立ちません。それ以上のものがあり、[a-z]すべてのロケールで常にASCII小文字を意味しなければならないという個人的な意見を強要します。

ベストアンサー1

私が読んだことPOSIXステータス。私の説明は、2つの不平等な概念があるということです。

  • ソート順序(組み合わせ順序)
  • 順序の並べ替え

関連スニペット[強調内容]:

このLC_COLLATEカテゴリは以下を提供します。順序の並べ替えls多数のユーティリティ(など)の定義、POSIX.1-2017のシェル、およびユーティリティボリューム内の正規表現の一致sort(正規表現を参照)、POSIX.1-2017のシステムインターフェイスボリューム内の、strcoll()およびstrxfrm()関数wcscoll()wcsxfrm()

順序の並べ替え定義では、ロケールの照合順序要素(文字および複数文字照合要素)間の相対順序を定義する必要があります。順序は照合値として表されます。つまり、各要素に1つ以上の照合順序値(データ照合重みとも呼ばれる)を割り当てます。 [… ]

キーワードはorder_start次のようにする必要があります。順序の並べ替え項目を指定し、その項目の重みの数を定義します。順序の並べ替え定義およびその他のソート規則。

これ順序の並べ替えこのセクションの定義は、正規表現の角かっこ式の解釈に影響します(RE角括弧式を参照)。

ソート順sort、つまり重みが重要です。照合順序シーケンスの場合、grep '[a-z]'これは照合順序項目の順序です。

残念ながら、ソート順序は次のとおりです。明確に定義したがって、ソート順が異なる概念であるという明示的な表示はありません。

ソート順序ソート
された要素の相対順序は、LC_COLLATE現在のロケールのカテゴリ設定によって決まります。調整順序はソートに使用され、各調整要素に割り当てられた調整重みによって決定されます。重みがない場合、ソート順序はorder_startカテゴリ内のキーワード間のソート要素の順序を指定します。order_endLC_COLLATE


私のDebian 9では、LC_COLLATE多くのロケールiso14651_t1_common/usr/share/i18n/locales/iso14651_t1_common。ファイルの関連フラグメントは次のとおりです。

<U0061> <a>;<BAS>;<MIN>;IGNORE # 198 a
<U00AA> <a>;<PCL>;<EMI>;IGNORE # 199 ª
<U00E1> <a>;<ACA>;<MIN>;IGNORE # 200 á
[…]
<U0062> <b>;<BAS>;<MIN>;IGNORE # 233 b
<U0253> <b>;<CRL>;<MIN>;IGNORE # 234 ɓ
<U1E03> <b>;<PCT>;<MIN>;IGNORE # 235 ḃ
[…]
<U007A> <z>;<BAS>;<MIN>;IGNORE # 507 z
<U017A> <z>;<ACA>;<MIN>;IGNORE # 508 <z'>
<U017E> <z>;<CAR>;<MIN>;IGNORE # 509 <z<>
[…]
<U0041> <a>;<BAS>;<CAP>;IGNORE # 517 A
<U00C1> <a>;<ACA>;<CAP>;IGNORE # 518 Á
<U00C0> <a>;<GRA>;<CAP>;IGNORE # 519 À
[…]
<U0042> <b>;<BAS>;<CAP>;IGNORE # 550 B
<U1E02> <b>;<PCT>;<CAP>;IGNORE # 551 <B.>
<U1E04> <b>;<BPT>;<CAP>;IGNORE # 552 Ḅ
[…]
<U005A> <z>;<BAS>;<CAP>;IGNORE # 813 Z
<U0179> <z>;<ACA>;<CAP>;IGNORE # 814 <Z'>
<U017D> <z>;<CAR>;<CAP>;IGNORE # 815 <Z<>

これは順序の並べ替え。 ()項目が項目間にない[a-z]ため含まれません。AA<U0041>az

a項目はまだA同じ照合記号を指定します<a>。同様に指定されますb。これは重みに変換されます。B<b>

<collating-symbol>重みは、文字(ロケール定義で指定されたすべての形式)、s、<collating-element>s、楕円、または特殊記号で表現する必要がありますIGNORE。単一文字a<collating-symbol>またはaは<collating-element>、文字内の相対位置を表す必要があります。順序の並べ替え文字や文字自体ではなく、文字や記号です。したがって、重みに絶対値を与えるのではなく、文字順序に基づいて対照要素に与えられた相対順序値を用いて特定の重みを表現する。順序の並べ替え

ファイル内<a>および は<b>次の順序で定義されます。

collating-symbol <a>
collating-symbol <b>

これにより、関連するサブシーケンスが作成されます。順序の並べ替えはいaAbB。それが重要ですsort


これを確認するために、次の照合順序項目を(一時的に)移動しました。

<U004B> <k>;<BAS>;<CAP>;IGNORE # 649 K

に項目が入る前の位置v、つまりaとの間のどこかですz。を使用してロケールを再構築しましたlocale-gen。今はsort file | tr -d '\n'まだ返されますが…iIjJkKlLmM…(重みは変更されず、順序は変更されません)、次のようにgrep '[a-z]' file | tr -d '\n'生成されます。

Kabcdefghijklmnopqrstuvwxyz

これはK、ソート順を変更して所属を作成したことを意味します。[a-z]

代わりにgrep '[a-z]' file | tr -d '\n'ソートを返すには、ソート順の異なるロケールを使用する必要があります。カスタムロケールにすることができます。aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZabcdefghijklmnopqrstuvwxyz

おすすめ記事