pdftk
— это утилита командной строки, позволяющая извлекать и изменять метаданные PDF-файлов с помощью параметров dump_data
и update_info
.
Следующая команда извлечет метаданные файла input.pdf
–metadata
:
pdftk input.pdf dump_data output metadata
Измените содержимое файла metadata
с помощью текстового редактора, затем обновите pdf-файл на новыйoutput.pdf
:
pdftk input.pdf update_info metadata output output.pdf
Чтобы проверить новый файл PDF (распечатайте на стандартный вывод):
pdftk output.pdf dump_data
Просто краткий комментарий об обновленной команде sed
в вашем вопросе, которая в настоящее время читается как
sed -i 's/^[a-zA-Z0-9-_]*$@^[a-zA-Z0-9-_]*$.^[a-z]*$/"${new_email_address}"/g' FILE
Обратите внимание, что это содержит два недопустимых диапазона символов (, оба читаются 0-9-_
), и что переменная new_email_address
не будет расширена оболочкой, поскольку она находится в одной строке -в кавычках. Я также не уверен, каково намерение с $@^
и $.^
, поскольку $
и ^
будут соответствовать этим символам буквально в этих позициях в выражении.
Не видя, как переменная $to
используется в остальной части файла, я собираюсь предположить, что она назначена только в одном месте и что строка, которую вы показываете, встречается точно так же, как и в файл.
sed 's/$to = ".*";$/$to = "'"$new_email_address"'";/' file >file.new
Нет смысла пытаться сопоставить адрес электронной почты, поскольку мы уже знаем, что переменная $to
содержит адрес электронной почты. Единственное, о чем нам нужно беспокоиться, это попытаться найти правильную линию. Общеизвестно трудность сопоставления адресов электронной почты с регулярными выражениями.
Несколько моментов, на которые следует обратить внимание:
$
в $to
не требует специальной обработки, так как он не стоит последним в выражении. Если вы используете -E
для включения расширенных регулярных выражений, то, во-первых, не делайте этого, а во-вторых, экранируйте $
в $to
как \$
в шаблоне. $to
будет , а не рассматриваться как переменная оболочки, поскольку она заключена в одинарные кавычки. $new_email_address
— это переменная оболочки, поэтому мы временно отказываемся от одинарных кавычек, чтобы представить значение этой переменной в двойных кавычках. Я бы посоветовал не использовать здесь -i
, так как вы еще не знаете, правильно ли работает подстановка или она портит файл. Вместо этого лучше записать результат в новое имя файла.
Кроме того, с помощью -ir
вы указываете sed
использовать r
в качестве суффикса файла резервной копии. Я предполагаю, что вы хотели использовать вариант-r
(или -E
, который чаще всего поддерживался бы ). Однако ни -r
, ни -E
не нужны, так как мы не используем никаких расширенных регулярных выражений для этой простой замены.
Проверка вышеуказанной команды:
$ cat file
$to = "example-1_2@example-1_2.com";
$ new_email_address=myself@my.host.here.net
$ sed 's/$to = ".*";$/$to = "'"$new_email_address"'";/' file >file.new
$ cat file.new
$to = "myself@my.host.here.net";
Если вы хотите заменить строку, состоящую из (1 )между двумя двойными -кавычками и (2 )с одним символом @ в середине, это регулярное выражение будет соответствовать ей :
. ]"[a-zA-Z_.-]*@[a-zA-Z_.-]*"
Обратите внимание, что тире должно быть в конце каждого класса символов, и я добавил точку до и после @.
Теоретически возможны и другие символы, например %. Проведя небольшое исследование, вы можете найти регулярные выражения, которые лучше соответствуют адресам электронной почты, но давайте предположим, что ваши адреса электронной почты соответствуют этому выражению.
Проблема заключается в замещающей строке в вашей sed
программе. Вам нужно поместить его между двойными -кавычками, так как он содержит переменную оболочки, а регулярное выражение также содержит двойные -кавычки.
На мой взгляд, самый простой способ решить эту проблему — поставить обратную косую черту перед двойными кавычками. Например
sed "s/\"[a-zA-Z0-9_.-]*@[a-zA-Z0-9_.-]*\"/\"${new_email}\"/"