Я нашел решение, используя функцию awk
GNU match
:
cat foos | \
gawk 'match($0, /([^0-9]+)([0-9]+)([^0-9]+)/, a) {print a[3], a[2], $0}' | \
sort | cut -d' ' -f3
Команда gawk
использует regex-захваты для генерации ключа сортировки, так что в итоге я получаю следующее:
a 03 foo03a
b 02 foo02b
...и т.д.
Прогоняем это через sort
, cut
для нужных мне полей. Готово.
Если у вас есть такой каталог:
.
├── X.1
├── X.2
├── X.3
├── Y.1
├── Y.2
└── Z.1
, затем
mkdir A
mv *X* A
(*X*
означает каждый файл или папку, содержащие X в своем имени)
приводит к
.
├── A
│ ├── X.1
│ ├── X.2
│ └── X.3
├── Y.1
├── Y.2
└── Z.1