_b
、、、、ファイルを含むディレクトリがあるとa
します。 cs_CZ.UTF8ロケールに基づいてファイルを並べ替えたいのですがc
č
d
いいえ下線を無視してください。つまり、次のようになります_b a c č d
。
現在のファイルは次のようにソートされていますls
。私が見つけたすべての答えはを使用することをお勧めしますが、順序は次のように変更されます。 (今はとの間ではなく終わりにあります。)ls | sort
a _b c č d
LC_COLLATE=C
_b a c d č
č
c
d
これを達成する方法はありますか?
a-n.pdf a-p.pdf a.pdf c č d
下線以外の文字にも興味があります。つまり、代わりにこれに基づいてソートしたいのですa-n.pdf a.pdf a-p.pdf c č d
。 (編集:実際にa.pdf a-n.pdf a-p.pdf c č d
英数字以外の文字が無視されない限り、それは大丈夫です。)
以下は私が望む答えではありません。
LC_COLLATE=C
上記のように使用され、- たとえば、
ls _*; ls [^_]*
質問はアンダースコアに関するものではないので、シェル拡張を使用します。
ベストアンサー1
GNU システムでは、非アルファ項目に NUL を追加すると便利です。
$ ls | sed 's/[^[:alpha:]]/&\x0/g' | sort | tr -d '\0'
_b
a
c
č
d
ファイル名に改行文字が含まれていないとします。通常、sort
ファイル名自体は複数行で構成できるため、ファイル名のリストを並べ替えることはできません。
並べ替える前に、ここでファイル名の改行を変更できます/
。そしてzsh
:
print -rNC1 -- *(N) | # print NUL-delimited
tr '\n\0' '/\n' |
sed 's/[^[:alpha:]]/&\x0/g' |
sort |
tr -d '\0' |
tr '/' '\n'
または、後処理を可能にするために、リストをNULで区切って保持してください。
print -rNC1 -- *(N) | # print NUL-delimited
tr '\n\0' '/\n' |
sed 's/[^[:alpha:]]/&\x0/g' |
sort |
tr -d '\0' |
tr '/\n' '\n\0'
strcoll()
ソートのためのAPIは2つのNUL終了文字列を使用します。従来のsort
実装はテキスト入力のみをサポートし、テキスト入力はNULを除外するので大丈夫です。ただし、sort
標準のテキストユーティリティのほとんどのGNU実装と同様に、GNUはNULとその入力をサポートしています。
GNUがNULのある行をどのように処理するのか正確にはわかりませんが、sort
私の考えでは、NULの行を分割してセグメントを1対1で比較するようです。たとえばfoo_\0car
、比較するときは、まず比較してから比較してください。foobar_\0more
foo_
foobar_
zsh
oe
rder(一部のコード評価o
ベースe
)またはo+function
glob修飾子を使用した変換を使用して、globの順序を定義することもできます。しかし、電話する前にstrcoll()
、zsh
NULを削除sort
したがって、上記のGNUと同じ変換は使用できません。
代わりに、0
アルファシーケンスではなくシーケンスの前にsを追加し、1
アルファシーケンスの前にsを追加できます。
存在する~/.zshrc
set -o extendedglob
mysort() {
REPLY=${REPLY//(#m)[^[:alpha:]]##/0$MATCH}
REPLY=${REPLY//(#m)[[:alpha:]]##/1$MATCH}
}
それから:
$ print -rC1 -- *(No+mysort)
_b
a
c
č
d