Как изменить адрес электронной почты на другой непосредственно в файле?

pdftk — это утилита командной строки, позволяющая извлекать и изменять метаданные PDF-файлов с помощью параметров dump_dataи update_info.

Следующая команда извлечет метаданные файла input.pdfmetadata:

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
0
13.03.2021, 18:09
2 ответа

Просто краткий комментарий об обновленной команде 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";
0
18.03.2021, 22:25

Если вы хотите заменить строку, состоящую из (1 )между двумя двойными -кавычками и (2 )с одним символом @ в середине, это регулярное выражение будет соответствовать ей :

. ]
"[a-zA-Z_.-]*@[a-zA-Z_.-]*"

Обратите внимание, что тире должно быть в конце каждого класса символов, и я добавил точку до и после @.

Теоретически возможны и другие символы, например %. Проведя небольшое исследование, вы можете найти регулярные выражения, которые лучше соответствуют адресам электронной почты, но давайте предположим, что ваши адреса электронной почты соответствуют этому выражению.

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

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

sed "s/\"[a-zA-Z0-9_.-]*@[a-zA-Z0-9_.-]*\"/\"${new_email}\"/"
0
18.03.2021, 22:25

Теги

Похожие вопросы