Скрипт Bash для изменения заголовков PDF - PullRequest
0 голосов
/ 04 октября 2018

Мне нужно изменить заголовок на многих файлах PDF.Pdftk прекрасно работает, и я попытался создать bash-скрипт (pdftitle), чтобы сделать его за один проход:

#!/bin/bash
newtitle=$2
pdftk "$1" data_dump output "$1".data.txt;
sed 's/^InfoKey:\sTitle\nInfoValue:\s.*/InfoKey:\sTitle\nInfoValue:'"$newtitle/" "$1".data.txt > "$1".data.fixed.txt;
pdftk "$1" update_info *.data.fixed.txt output "$1".fixed;
mv "$1".fixed "$1";
rm -f ./*.txt
exit;

Так что в клике я бы ввел

$> pdftitle mypdf.pdf "Новый заголовок"

Файл data.txt, создаваемый pdftk, имеет несколько строк, но цели - только две соответствующие строки:

...
InfoBegin
InfoKey: Author
InfoValue: Not Me
InfoBegin
InfoKey: Title
InfoValue: Microsoft Word - Old Title.doc
InfoBegin
InfoKey: Creator
InfoValue: PScript5.dll Version 5.2
...

Из которых необходима следующая строкаподлежит замене:

...
InfoKey: Title
InfoValue: Relevant New Title
...

Нет сообщений об ошибках, но заголовок остается без изменений.Так что, похоже, у sed есть проблемы здесь, но я не могу понять, где и как.

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

@ tripleee предоставил решение для идеальной работы скрипта bash:

#!/bin/bash
filename=$1
shift
pdftk "$filename" data_dump output |
awk -v title="$@" '/^InfoKey: Title/ { t=1 }
t && /^InfoValue:/ { $0 = "InfoValue: " title; t=0 }1' > data.txt
pdftk "$filename" update_info data.txt output "$filename".fixed &&
mv "$filename".fixed "$filename"
rm ./data.txt
0 голосов
/ 04 октября 2018

Вот рефакторинг с использованием Awk, который предполагает, что pdftk может записывать и считывать из stdin / stdout, используя - в качестве аргумента псевдонима.

#!/bin/bash
filename=$1
shift
pdftk "$filename" data_dump output - |
awk -v title="$*" '/^InfoKey: Title/ { t=1 }
    t && /^InfoValue:/ { $0 = "InfoValue: " title; t=0 }1' |
pdftk "$filename" update_info - output "$filename".fixed &&
mv "$filaname".fixed "$filename"

Шаблон для установки переменной флага, когдаВы видите шаблон и затем действуете на следующей строке, если эта переменная установлена, является простой и очень распространенной идиомой Awk.

Нет необходимости использовать конечные точки с запятой или явный exit в конце.

...