Ответ на ваш вопрос зависит от того, может ли эта строка появляться только один раз или несколько раз в рассматриваемом PDF-файле (с ). Предполагая, что это может произойти только один раз, и рассматриваемая строка содержится как фактический текст (, т.е. не только в графической форме )следующий подход, который требует GNU Awk и внешнего инструмента pdftotext
, должно работать (пример для одного файла, переданного в качестве параметра):
#!/bin/bash
OLDNAME="$1"
NUMBER="$(pdftotext "$OLDNAME" - | awk '/R E A D I N G/ {match($0,"R E A D I N G ([[:digit:]])( [[:digit:]])*",a); gsub(" ","",a[2]); print a[1] a[2];}')"
NEWNAME="$NUMBER.$OLDNAME"
mv "$OLDNAME" "$NEWNAME"
Функция match
функции awk
проверяет наличие определенного паттерна и выводит «фактическое значение» паттерна в выходной массив a
, где записи a[0]
содержат весь найденный паттерн и a[1]
- a[n]
содержат «фактические значения» любых вложенных -выражений, заключенных в круглые скобки в шаблоне, в нашем случае «числовая часть» ([[:digit:]])( [[:digit:]])*
в элементах массива 1 и 2 (ср. например. раздел GNU Awk User's Guide, посвященный «строковым функциям»). Если результат однозначный -, число a[2]
останется пустым, что не имеет значения. Поскольку в случае двух цифр -пробел между цифрами также будет совпадать, мы используем функцию awk
gsub()
, чтобы удалить его в случае двух цифр -.
Чтобы применить его к нескольким файлам, вы можете изменить сценарий следующим образом, а затем передать весь список PDF-файлов в качестве аргумента (, например./rename.sh *.pdf
).
#!/bin/bash
for OLDNAME in "$@"
do
NUMBER="$(pdftotext "$OLDNAME" - | awk '/R E A D I N G/ {match($0,"R E A D I N G ([[:digit:]])( [[:digit:]])*",a); gsub(" ","",a[2]); print a[1] a[2];}')"
NEWNAME="$NUMBER.$OLDNAME"
mv "$OLDNAME" "$NEWNAME"
done