Я не могу придумать способ сделать это изначально в оболочке, но в perl
, например, вы могли бы определить регулярное выражение для разделения полей, и используйте его, чтобы вставить один разделитель по вашему выбору, который затем можно было бы просто прочитать, используя IFS =,
или что-то еще.
Согласно вашему образцу, поля могут быть разделены пробелом, за которым следует:
Итак, передайте вашу команду примерно так:
. . . |
perl -F'[[:space:]](?=[[:upper:]-]|[[:digit:]]{2,})' -anle 'print join ",", @F'
С zsh
:
(LC_ALL=C; pdfjam ./*.pdf(n) --nup 1x1)
будет работать. (n)
- квалификатор zsh
glob для числовой сортировки. В языковом стандарте C «5a»
сортируется после «5 G»
, поскольку пробел сортируется перед a
. В некоторых других регионах «a»
может выполнять сортировку перед «G»
, потому что пробелы и регистр будут проигнорированы при первом проходе (а A
стоит перед G
)
С другими оболочками и в GNU или совместимых системах вы можете сделать:
printf '%s\0' ./* | LC_ALL=C sort -t/ -znk2 |
xargs -r0 sh -c 'pdfjam "$@" --nup 1x1' sh
Обратите внимание, что если список файлов слишком велик, а с подходом zsh
, вы получите ошибку, здесь будет запущено несколько pdfjam
, что, вероятно, тоже не то, что вам нужно (и может остаться незамеченным).
Вместо использования LC_ALL = C
выше, чтобы убедиться, что пробелы сортируются перед
, другой подход может заключаться в числовой сортировке, но по связям, лексической сортировке (в соответствии с правилами локали ) только в первом поле:
printf '%s\0' [0-9]* | sort -z -k1n -k1,1 |
xargs -r0 sh -c 'pdfjam "$@" --nup 1x1' sh
Это позволит 5a
сортировать до 5B
, если регистр игнорируется для сортировки в вашей локали. 05a
все равно будет выполнять сортировку перед 5
.
С bash
4.4 и выше вы также можете:
readarray -td '' files < <(
printf '%s\0' [0-9]* | sort -z -k1n -k1,1)
pdfjam "${files[@]}" --nup 1x1