如何从Bash中以数字方式对包含公共前缀和后缀的字符串进行排序?

AWE*_*AWE 29 unix linux sorting bash

这是一个文件列表:

some.string_100_with_numbers.in-it.txt
some.string_101_with_numbers.in-it.txt
some.string_102_with_numbers.in-it.txt
some.string_23_with_numbers.in-it.txt
some.string_24_with_numbers.in-it.txt
some.string_25_with_numbers.in-it.txt
Run Code Online (Sandbox Code Playgroud)

现在我想用数字排序.以*23*开头,以*102*结尾.

我曾尝试-n-g.-t在这些凌乱的字符串中没有帮助.

我可以忽略带有选项的数字的前导字符串,还是我必须聪明和脚本?

Ste*_*eve 39

使用 ls -lv

从手册页:

-v     natural sort of (version) numbers within text
Run Code Online (Sandbox Code Playgroud)

  • 注意`ls`的`-v`选项是GNU扩展名; 因为你在Linux上,这没关系,但它不能随便携带到其他系统. (4认同)
  • 是否有类似的命令使用 `find` 而不是 `ls`(或者可能是管道到 `sort`)? (2认同)
  • 在Mac上,你可以`brew install coreutils`并使用`gls`. (2认同)

Joã*_*lva 33

请尝试以下方法:

sort -t '_' -k 2n
Run Code Online (Sandbox Code Playgroud)
  • -t '_' (将分隔符设置为下划线字符)
  • -k 2n (使用数字排序按第二列排序)

演示.


Rhu*_*arb 5

如果可用,只需使用sort -V. 这是对版本号的排序,但作为“自然排序”选项效果很好。

$ ff=$( echo some.string_{100,101,102,23,24,25}_with_numbers.in-it.txt )
Run Code Online (Sandbox Code Playgroud)

无排序:

$ for f in $ff ; do echo $f ; done
some.string_100_with_numbers.in-it.txt
some.string_101_with_numbers.in-it.txt
some.string_102_with_numbers.in-it.txt
some.string_23_with_numbers.in-it.txt
some.string_24_with_numbers.in-it.txt
some.string_25_with_numbers.in-it.txt
Run Code Online (Sandbox Code Playgroud)

使用排序 -V:

$ for f in $ff ; do echo $f ; done | sort -V
some.string_23_with_numbers.in-it.txt
some.string_24_with_numbers.in-it.txt
some.string_25_with_numbers.in-it.txt
some.string_100_with_numbers.in-it.txt
some.string_101_with_numbers.in-it.txt
some.string_102_with_numbers.in-it.txt
Run Code Online (Sandbox Code Playgroud)