Если вы не можете вызвать строку «RewriteEngine On» (поскольку она иногда используется законно), то «sed», вероятно, не является подходящим инструментом для работы. Я бы использовал Perl (проверенный код следует):
my $file;
do { local $/; $file = <>; }; # Slurp!
$file =~ s{
RewriteEngine \s On \n
RewriteCond \s %{HTTP_REFERER} \s [\^]http:// \n
RewriteCond \s %{HTTP_REFERER} \s !%{HTTP_HOST} \n
RewriteRule \s \. \s http://targeturlhere\.net/%{REMOTE_ADDR} \n
}{}gmsx;
print $file;
Файл захвачен в память; затем ненужные данные удаляются (повторно, на случай, если один из файлов был изменен несколько раз), затем остаток записывается в стандартный вывод. Модификаторы gmsx
делают:
- г - глобальный
- м - многострочный
- s - sed-like
- x - расширенный (пробел игнорируется - используйте
\s
(или \s+
) для соответствия фактическому пробелу.
Это предназначено для обработки по одному файлу за раз (на вызов скрипта). Вы можете заставить его обрабатывать несколько файлов в командной строке с перезаписью оригиналов и т. Д., Если вы будете осторожны; проблемная область - операция 'slurp'. Код предполагает, что вы хотите прочитать все файлы в память и поработать над этим - это правильно, так как вам нужно сопоставить несколько строк.
Комментарий спрашивает:
[У меня уже есть работающий скрипт bash, который перечисляет и сканирует размещенные сайты, затем удаляет файлы, содержащие только эти строки, и я ждал, чтобы добавить эту функцию редактирования. Могу ли я просто использовать Perl внутри этого скрипта или вызвать его?
Если вы можете определить, что файл содержит материал, отличный от четырех строк, которые вам нужно удалить, вы можете вызвать Perl из скрипта для работы с этим файлом:
У вас могут быть другие способы сделать это, но он должен быть настолько сложным. Я предполагаю, что у вас есть переменная tmp
, инициализированная соответствующим образом:
tmp=${TMPDIR:-/tmp}/fixit.$$
Возможно, вы захотите включить trap-сообщения, чтобы обеспечить очистку файла:
trap "rm -f $tmp.?; exit 1" 0 1 2 3 13 15
...code as above...
rm -f $tmp.?
trap 0
exit 0
Первая строка прерываний перехватывает сигналы 1 (HUP), 2 (INT), 3 (QUIT), 13 (PIPE) и 15 (TERM), а также любой выход оболочки самостоятельно (0) и выполняет команду заданные команды (удаление временного файла и выход с состоянием ошибки). Строка stray rm -f
гарантирует, что файл отсутствует; trap 0
отменяет ловушку для «самостоятельного выхода из оболочки», а exit 0
успешно завершается. Это означает, что вы можете прервать свою обработку и не оставлять чужие файлы - хорошая практика для любого сценария оболочки, который создает временные файлы.
В качестве альтернативы вы можете использовать:
perl -i.bak fixit.pl $file
Это создаст имя файла «$ file.bak» с оригиналом, и результат будет отправлен к исходному имени файла «$ file». Это избавляет от необходимости использовать ловушки и т. Д. Если вам не нужен файл резервной копии, пропустите «.bak» из командной строки.