Ошибка плохой замены с pdfgrep в качестве переменной? - PullRequest
0 голосов
/ 17 февраля 2019

Я использую bash-скрипт для анализа информации из PDF-файла и использования его для переименования файла (с помощью pdfgrep).Однако после некоторой работы я получаю сообщение об ошибке «Bad Substitution» со строкой 5. Есть идеи, как ее переформатировать?

shopt -s nullglob nocaseglob
for f in *.pdf; do
    id1=$(pdfgrep -i "ID #: " "$f" | grep -oE "[M][0-9][0-9]+")
    id2=$(pdfgrep -i "Second ID: " "$f" | grep -oE "[V][0-9][0-9]+")
    $({ read dobmonth; read dobday; read dobyear; } < (pdfgrep -i "Date Of Birth: " "$f" | grep -oE "[0-9]+"))
    # Check id1 is found, else do nothing
    if [ ${#id1} ]; then
       mv "$f" "${id1}_${id2}_${printf '%02d-%02d-%04d\n' "$dobmonth" "$dobday" "$dobyear"}.pdf"
    fi
done

Ответы [ 2 ]

0 голосов
/ 17 февраля 2019

Делайте то, что предлагает Чарльз, при создании нового имени файла, но вы можете рассмотреть другой подход к синтаксическому анализу PDF-файла, чтобы уменьшить количество pdfregs, каналов и greps, которые вы делаете для каждого файла.У меня нет pdfgrep в моей системе, и я не знаю, как выглядит ваш входной файл, но если мы используем этот входной файл:

$ cat file
foo
ID #: M13
foo
Date Of Birth: 05 21 1996
foo
Second ID: V27
foo

и grep -E вместо pdfgrep, то вот какЯ бы получил информацию из входного файла, просто прочитав его один раз с помощью pdfgrep и проанализировав этот вывод с помощью awk вместо того, чтобы читать его несколько раз с помощью pdfgrep и используя несколько каналов и greps для извлечения информации, которую вы получили.need:

$ grep -E -i '(ID #|Second ID|Date Of Birth): ' file |
awk -F': +' '{f[$1]=$2} END{print f["ID #"], f["Second ID"], f["Date Of Birth"]}'
M13 V27 05 21 1996

Учитывая, что вы можете использовать тот же подход read для сохранения вывода в переменных (или массиве).Очевидно, вам может понадобиться выполнить команду awk в зависимости от того, как на самом деле выглядит ваш вывод pdfgrep.

0 голосов
/ 17 февраля 2019

В этом коде есть несколько не связанных ошибок;исправленная версия может выглядеть следующим образом:

#!/usr/bin/env bash
shopt -s nullglob nocaseglob
for f in *.pdf; do
    id1=$(pdfgrep -i "ID #: " "$f" | grep -oE "[M][0-9][0-9]+") || continue
    id2=$(pdfgrep -i "Second ID: " "$f" | grep -oE "[V][0-9][0-9]+") || continue
    { read dobmonth; read dobday; read dobyear; } < <(pdfgrep -i "Date Of Birth: " "$f" | grep -oE "[0-9]+")
    printf -v date '%02d-%02d-%04d' "$dobmonth" "$dobday" "$dobyear"
    mv -- "$f" "${id1}_${id2}_${date}.pdf"
done
  • < (...) не имеет смысла синтаксиса bash.Если вы хотите перенаправить из процесса подстановки , вам следует использовать синтаксис перенаправления <, а подстановка процесса <(...) отдельно.
  • $(...) создает субоболочку - отдельнуюпроцесс с собственной памятью, так что переменные, назначенные в этом подпроцессе, не отображаются в большей оболочке в целом.Следовательно, если вы хотите, чтобы содержимое, установленное вами с помощью read, было видимым, вы не можете иметь его в подоболочке.
  • ${printf ...} не имеет смысла синтаксиса.Возможно, вы хотели подстановку команды?Это было бы $(printf ...), а не ${printf ...}.Тем не менее, более эффективно использовать printf -v varname 'fmt' ..., что позволяет избежать дополнительных затрат на ответвление от подоболочки.
  • Поскольку мы добавили || continue s в команду id1=$(... | grep ...), нам больше не нужно проверять,id1 не пусто: continue сработает и заставит оболочку перейти к следующему файлу в случае сбоя grep.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...