如何从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

现在我想以数字为单位。从 *23 *开始,然后以 *102 *。

结束

我尝试了-n-g-t在这些混乱的字符串中无济于事。

我可以忽略一个选项的领先字符串,还是必须聪明且脚本?

使用 ls -lv

从"人"页面:

-v     natural sort of (version) numbers within text

尝试以下内容:

sort -t '_' -k 2n
  • -t '_'(将定界符设置为下划线字符)
  • -k 2n(使用数字订购的第二列列表)

demo

如果可用,只需使用sort -V即可。这是版本编号的一种类型,但可以作为"自然排序"选项运行良好。

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

没有排序:

$ 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

sort -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

在一般情况下,尝试schwartzian变换。

简要地,将数字分解为自己的字段,对此进行排序,然后丢弃添加的字段。

# In many shells, use ctrl-v tab to insert a literal tab after the first 2
sed 's/^([^0-9]*)([0-9][0-9]*)/2   12/' file |
sort -n |
cut -f2-

如果输入没有明显的分离器,则可以很好地工作,例如对于以下输入。

abc1
abc10
abc2

您希望在第一个之后将最后一行移动的位置。

不是直接的,但是您可以重命名文件零件(根据需要使用其他填充零)为前缀。

ex:1.txt,23.txt,2.TXT重命名为01.txt,23.txt,02.txt

现在ls默认输出是数值顺序01.txt02.TXT23.txt

一个简单的Python脚本可能会为您提供帮助。如果您愿意,您甚至可以使用Regex进行一次拍摄。

import glob
files = glob.glob('*[0-9]*.py')
print(files)
import os
for f in files:
    # 64.smallest_word_window.py
    parts = f.split('_')
    number = str('%04d' % (int(parts[0])))+'_'
    del parts[0]
    new_parts = number + '_'.join( parts )
    print(f'{new_parts}')
    os.rename(f, new_parts)

最新更新