对名称的一部分进行排序

对名称的一部分进行排序

我有多个具有相同前缀的名称,但前缀未知。

我只想按名称中的数字排序。

IE

abcd_006-123
abcd_006-232
bbcd_w_006-112

所以bbcd_w_006-112应该是第一个

谢谢

答案1

使用zsh,您可以定义一个全局排序函数,例如:

digitsOnly() REPLY=${REPLY//[^0-9]} # removes all non-digits

然后将其用作:

print -rC1 -- *(no+digitsOnly)

在那里,nglob 限定符将numericglobsort选项转换为该 glob 扩展,并o+function根据$REPLY的输出(通过 )进行排序function

print -rC1在olumn上打印其参数raw 。1 c

请记住,如果您使用ls,ls会在打印之前对文件列表进行排序(默认情况下按字母顺序)。通过 GNU 实现ls,可以使用以下选项来避免排序-U

ls -ldU -- *(no+digitsOnly)

您可以执行类似的操作perl

perl -le 'sub digitsOnly {$_=shift; s/\D//gr};
          print for sort {digitsOnly($a) <=> digitsOnly($b)} <*>'

或者对该文件列表运行命令:

perl -l0e 'sub digitsOnly {$_=shift; s/\D//gr};
           print for sort {digitsOnly($a) <=> digitsOnly($b)} <*>' |
   xargs -r0 ls -ldU --

相关内容