26685


grep, awk, sed etc など、テキストに対して動作するコマンドとその挙動の仕様を posix
は定めています。テキストなので、文字コーディングをどう扱うかの問題があるかと思います。

posix がサポートする文字コードは何ですか？(どのような文字コードファイルだったら posix で処理できますか？)


CC BY-SA 3.0
2016-06-11T03:49:06.583
26645
2016-06-12T11:33:57.173
754
question
posix
posix でサポートしている文字コーディングは？


日本語が混ざっているような文章で正規表現が正しく動作するかという視点で調べました。たとえば、"aあ0"と言う文字列が正規表現"a.0"にマッチするかどうかです。

POSIXが標準で必ずサポートするロケールはCのみです。それ以外が存在するかは環境依存になりますし、OSがサポートしているロケールであっても、インストールされていなければ使用できません。CロケールはASCIIエンコード[1](https://osdn.jp/magazine/06/05/09/0220213)です。また、全てのロケールでは共通文字集合[2](http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap06.html#tagtcjh_3)のみがサポートされます。

では、grepがCロケール(ASCIIエンコード前提)として動いて、共通文字集合のみをサポートするかと言うとそうではありません。少なくともGNU
grepは、サポートするロケールであれば、そのロケールに従って動作します[3](https://linuxjm.osdn.jp/html/GNU_grep/man1/grep.1.html)。GNU
grepだけではなく、OS Xのgrepも同じようにロケールに従って動作します(OS X 10.11.5のja_JP.UTF-8環境で`echo 'aあ0'
| grep 'a.0'`と実行して確認)。ただ、GNU
grepのマニュアルにあるとおり、OSがサポートしているロケールであっても、インストールされているgrepが実際に動作するかはコンパイル時の設定などの環境依存となります。

sedについてはOS Xでは同様に対応していました。awkについてはOS Xの標準(/usr/bin/awk)では対応してませんでしたが、home
brewで入れたgawkでは対応していました。

以上を踏まえると、ASCII以外については、OSやgrep/sed/awkの実装、およびインストールされているロケールや実行環境のロケールによって対応しているかが変わることになります。どんな環境でも動作するのは、ASCIIエンコードのみであり、確実に同じ動作をする場合は、Cロケールにして実行する必要がある、が結論かと思います。

もし、日本語混じりの文字列を、文字コードを考慮して正確に処理したいのであれば、Rubyなど言語レベルで複数の文字コードをサポートしているスクリプト言語で処理することを検討すべきでしょう。


CC BY-SA 3.0
2016-06-12T11:09:17.010
26681
2016-06-12T11:09:17.010
7347
26645
answer


[unix & Linux で回答を得た](https://unix.stackexchange.com/a/289258/157713)
ので、ここに転記しておきます。

まず、どのような文字コードをサポートについては、 posix ではいくつかの制約が課されるだけで、基本的にほとんど自由にシステムが定義できるそうです。

  * Portable Character Set がすべてサポートされていること
  * Portable Character Set はすべて 1 byte で表されること
  * Null は絶対 00
  * '0'-'9' はこの順に隣接した値を持つこと

POSIX は、 C ロケールを提供することをシステムに求めますが、各文字が実際にどのようにエンコードされるかは、未定義だそうです。

昔どこかで聞きかじったことの中に、C言語で 'a'
とか記述しても、実際にどの値にマップされるかは処理系依存、みたいな話があった記憶があります。その話のことなのかもしれません。


CC BY-SA 3.0
2016-06-12T11:33:57.173
26685
2016-06-12T11:33:57.173
2017-04-13T12:37:20.867
-1
754
26645
answer