私はそれらすべてを試しました
... | 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の起源。
特に、あなたは同じものを見つけるでしょう-t
FreeBSDなどの厄介で破損したオプションの処理。
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 '\\0whatever
NUL文字で区切ります-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±'