ロケールに従って ls 出力をソートしますが、英数字以外の文字は無視しません。

ロケールに従って ls 出力をソートしますが、英数字以外の文字は無視しません。

_b、、、、ファイルを含むディレクトリがあるとaします。 cs_CZ.UTF8ロケールに基づいてファイルを並べ替えたいのですがcčdいいえ下線を無視してください。つまり、次のようになります_b a c č d

現在のファイルは次のようにソートされていますls。私が見つけたすべての答えはを使用することをお勧めしますが、順序は次のように変更されます。 (今はとの間ではなく終わりにあります。)ls | sorta _b c č dLC_COLLATE=C_b a c d ččcd

これを達成する方法はありますか?

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_\0morefoo_foobar_

zshoerder(一部のコード評価oベースe)またはo+functionglob修飾子を使用した変換を使用して、globの順序を定義することもできます。しかし、電話する前にstrcoll()zshNULを削除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

おすすめ記事