Unix アライメントでは、フィールド区切り文字でフレームに縛られない区切り文字「±」は許可されません。

Unix アライメントでは、フィールド区切り文字でフレームに縛られない区切り文字「±」は許可されません。

私はそれらすべてを試しました

... | sort -k'1,1r' -k'2,2' -t'±'

... | sort -k'1,1r' -k'2,2' -t$'\xC2\xB1'


*$> sort: ±: Invalid argument*

ソートがサポートされていないことを願っています。欠落したエスケープ処理または特殊文字処理のみがあります。

私の設定は次のとおりです

localhost:~ user$ locale
LANG=
LC_COLLATE="C"
LC_CTYPE="UTF-8"
LC_MESSAGES="C"
LC_MONETARY="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_ALL=

localhost:~ user$ sort --version
2.3-Apple (99)

答え1

見たらApple macOSのソースコードsort、これを少し修正しました。FreeBSDの起源

特に、あなたは同じものを見つけるでしょう-tFreeBSDなどの厄介で破損したオプションの処理

            case 't':
                while (strlen(optarg) > 1) {
                    if (optarg[0] != '\\') {
                        errc(2, EINVAL, "%s", optarg);
                    }
                    optarg += 1;
                    if (*optarg == '0') {
                        *optarg = 0;
                        break;
                    }
                }

見て-t、再びパラメータが空の場合(この場合はNULが区切り文字)、単一のパラメータが含まれている場合にのみ可能です。バイト任意の数の\文字で始まり、その後にバイトが続くか(この場合はバイトが区切り文字として使用されます)、後に0何も出ません。この場合、区切り記号はですNUL

例:

  • -t ''または-t '\0'、または、-t '\\\\\0'または-t '\\0whateverNUL文字で区切ります
  • -t '\t'-t '\\\t'境界t
  • -t '\'-t '\\\\\'バックスラッシュで区切られます。

それにもかかわらず、区切り文字は1つだけ使用できます。バイトこの不思議な追加処理を使用して、-t '\0'GNUとの互換性のためにNUL区切り文字を指定することもできますsort(FreeBSDsortはGNUでしたsort)。その約束これはオプションとは関係がないため、-t区切り文字を-t '\\'指定するためにも使用できます(GNUで許可されていない)。\sort

したがって、マルチバイト文字を区切り文字として使用することはできません。

マルチバイト文字を許可する実装はあまりありませんsort。 GNUやbusyboxもsort同様です。しかしast-openはsort

ここでは±、ソート前にシングルバイト文字(可能であればソートに影響を与えないように入力に表示されない文字)に置き換えて、後で復元できます。ありがたいことに、FreeBSDtrとおそらくmacOStrもマルチバイト文字(GNUとは反対tr)をサポートしています。

<input tr '±\1' '\1±' | sort -t $'\1' ... | tr '±\1' '\1±'

関連情報