У меня есть скрипт для замены определенного адреса электронной почты в различных файлах. Адрес замены является первым параметром скрипта:
#!/bin/bash
perl -pi -e s/'name\@domain\.org'/$1/ file-list
Это не работает, так как символ @
в $1
заменяется perl. Есть ли простое решение для этого? Запуск скрипта как subst foo\@bar.com
, subst foo\\@bar.com
, subst "[email protected]"
и т. д. не работает. Есть ли сценарий sed, который мог бы справиться с этим проще?
Спасибо - это работает, если вы замените name@
на name\@
; Я приму, если вы опубликуете это. Однако я не могу заставить его выполнять замену на месте, так что на самом деле это не однострочник - возможно ли это?
То, как вы это разместили, $1
заменено на bash, потому что оно не в одинарных кавычках.
Если не разрешены частичные совпадения, например. [email protected]
, возможно, вы захотите приспособиться к этому. Во-первых, определив, как адреса электронной почты разделены в ваших файлах. Похоже, что они заключены в одинарные кавычки (или вы просто не понимаете, как работают однострочники Perl). Если так, то это сработает. Кроме того, вы можете получить доступ к переменным оболочки внутри Perl через хэш %ENV
, например. perl -i -pe's/.../$ENV{1}/g' file-list
@TLP Чтобы получить доступ к переменной оболочки через %ENV
Perl, вы должны сначала экспортировать переменную в среду оболочки.
@JRFerguson Понятно. Спасибо.
Это работает, но вам нужно передать скрипту новый адрес электронной почты с символом @
, которому предшествует \\
:
#!/bin/bash
perl -pi -e "s/name\@domain.org/$1/" file-list
Если скрипт subst
, запустите как:
subst newname\\@example.com
Это лучшая альтернатива, которая использует sed
для экранирования:
#!/bin/bash
ADR = "$(echo "$1" | sed -e 's/@/\\\@/')"
perl -pi -e "s/name\@domain.org/$ADR/" file-list
Конечно, в этом случае, вероятно, лучше использовать sed
, чтобы сделать все это.
Вместо расширения переменной оболочки непосредственно в коде perl вы можете передать ее в качестве аргумента, установив переключатель s
:
#!/usr/bin/env bash
perl -i -spe 's/name\@domain\.org/$replacement/' -- -replacement = "$1" file1.txt file2.txt
В Perl s///
без использования модификаторов e
или ee
переменные в замещающей части обрабатываются как литералы, поэтому вам не нужно их экранировать.
perl -spe 's/name@domain\.org/$replace/' -- -replace = "$1" file-list