Попробуйте сделать так:
cat... | sed -n '/^>/ { s/.*description: *//; s/\[.*//; p; }'
(Не проверено, так как я на мобильном телефоне.)
Есть более изящные способы; например, цикл Awk был бы наиболее гибким.
В zsh
это будет просто:
qpdf --empty --pages./*.pdf(On) -- output.pdf
Где On
— это квалификатор глобуса — o
rder расширение глобуса в обратном (заглавном O
, нижний регистр — прямой )порядок по n
ame.
Вы также можете добавить квалификатор n
glob для того, чтобы -порядок имен был числовым:
qpdf --empty --pages./*.pdf(nOn) -- output.pdf
Сравните:
$ print -r./*.pdf(On)
./file3.pdf./file2.pdf./file1.pdf./file11.pdf./file10.pdf
$ (LC_ALL=C; print -r./*.pdf(On))
./file3.pdf./file2.pdf./file11.pdf./file10.pdf./file1.pdf
(в лексическом порядке file10.pdf
стоит перед file2.pdf
и даже перед file1.pdf
в локалях, где пунктуация (здесь.
)игнорируется в первом приближении при сравнении строк ).
С:
$ print -r./*.pdf(nOn)
./file11.pdf./file10.pdf./file3.pdf./file2.pdf./file1.pdf
file10.pdf
идет после file3.pdf
, потому что с n
последовательности десятичных цифр сравниваются численно (, что похоже на то, что делается GNU ls -v
или GNUsort -V
).
(Для оболочки GNU bash)
Вы можете использовать tac
, чтобы перевернуть список аргументов, идущих к xargs
. Для команды qpdf
, которую вы запускаете, мы должны объединить еще два аргумента:--
и out.pdf
в конце.
Здесь используется новая строка в качестве разделителя аргументов, что означает имена файлов с новыми строками не обрабатываются:
printf "%s\n" "out.pdf" "--" *.pdf | tac | xargs -d'\n' qpdf --empty --pages
А здесь для любых имен файлов с использованием нулевого разделителя:
printf "%s\0" "out.pdf" "--" *.pdf | tac -s $'\0' | xargs -0 qpdf --empty --pages
Я протестировал (оболочку GNU Bash в Linux ), она объединила файлы в ожидаемом обратном порядке.
Вы можете использовать ответы наКак изменить аргументы оболочки? , чтобы обратить вспять то, во что расширяется *.pdf
. Сначала сохраните это как позиционные параметры оболочки:
set -- *.pdf
Затем используйте любой хороший ответ на связанный вопрос. Я выбираю этот:
flag=''; for a in "$@"; do set -- "$a" ${flag-"$@"}; unset flag; done
Теперь "$@"
расширяется до того, что вы хотите. Используйте его с желаемой командой:
qpdf --empty --pages "$@" -- out.pdf
Если вы не хотите терять старые позиционные параметры, запустите три команды в подоболочке.