Задать вопрос
@Starik007

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

У меня есть файл apache2.conf и я пытаюсь сделать замену в строке "ScriptAlias /php-bin/ /var/www/*" , только предварительно выполнив поиск между значениями ServerName $domain и < / VirtualHost >.
Подскажите пожалуйста, как примерно это можно реализовать?

Сейчас разбираюсь с perl, нашел пример с заменой, но он полностью стирает всё что найдено между ServerName и < / VirtualHost > , а мне нужно хотя бы дописать, а в идеале - заменить строку в пределах ServerName $domain и < / VirtualHost >.

my $apacheconf = '/etc/apache2/apache2.conf';
		open(my $fh, '<:encoding(UTF-8)', $apacheconf);	
	
		my $newtext = "\n\tScriptAlias /php-bin/ /var/www/"."$user"."\n";

		my $find = "/var/www/$user/data/www/$domain";
		
		my $str = "";

		while (my $rowa = <$fh>) {
		  chomp $rowa;
		  $str .= "$rowa\n";
		}
		close $fh;
		my $string = $str;
		$string =~ s/(ServerName $domain).*?(\<\/VirtualHost\>)/$1$newtext$2/gis;
  • Вопрос задан
  • 100 просмотров
Подписаться 1 Средний Комментировать
Пригласить эксперта
Ответы на вопрос 2
@ShamblerR
дай пример реального конфига
Ответ написан
shoorick
@shoorick
программист
1. Для начала почитайте документацию — man perlre — пригодится в любом случае.

2. Затем определитесь с квантификаторами в регулярном выражении: меня смущает звёздочка с вопросительным знаком — обычно для того, чтобы обозначить ноль или больше любых символов применяют либо звёздочку, если нужно жадное поведение (.* — максимально возможное количество любых символов) либо плюс с вопросительным знаком, если жадность не нужна (.+? — минимально возможное количество любых символов).

3. Попутно можно и процедуру чтения файла упростить — можно сразу считать его в одну длинную строку, а не собирать её по кусочкам.

4. Как дальнейшее развитие третьего пункта — сто́ит активнее использовать различные ключи, с которыми запускается интерпретатор перла для того, чтобы не писать вручную всякий рутинный код — см. man perlrun. Например, многострочную inplace-замену в файле с сохранением резервной копии можно выполнить командой
perl -0777 -pi~ -e 's/что/куда/g' /путь/к/файлу/где/менять.conf

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

5. Ну и всё-таки надо чётко сформулировать, что же вам надо. Я могу предположить, что вы хотите заменить строку "/var/www/$user/data/www/$domain" на "\n\tScriptAlias /php-bin/ /var/www/$user\n", но из вашего вопроса это явно не следует.

6. В вашем примере стирается слишком многое из-за того, что вы меняете на новое содержимое не то, что лежит в переменной $find, а вообще что угодно (.*).
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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