LINUX.ORG.RU

Удалить неуникальную часть файла.


1

0

задача такая: есть файл httpd.conf и надо написать скрипт (на shell, perl ) не важно , который бы удалял часть этого файла , а именно одну из секций
<VirtulaHost tralilia>
Servername
..
..
</VirtualHost>

проблема в том что некоторые части итих секции не являются уникальными , т.е . regex-ы не подойдут .

вобшем подскадите хотябы идею как это можно осушествить , а тто что-то ничего придумать не могу.

anonymous

Поподробнее почему не подойдут regex-ы...указанную тобой секцию можно элементарно удалить из файла:

#!/usr/bin/perl

$whost = $ARGV[0];
$section = qr/<VirtualHost $vhost>.*?<\/VirtualHost>/io;
$httpd_conf =~ s/$section//;

anonymous
()
Ответ на: комментарий от anonymous

пожалуйста подробнее , что делает qr ? как я понял все между двумя указаными строчками соответствует ?

anonymous
()
Ответ на: комментарий от anonymous

qr просто компилирует regex, можно и без него
s/<VirtualHost $vhost>.*?<\/VirtualHost>//io;

bla-bla
-------------------------*
<VirtualHost имя_хоста>  |
 любой текст             | < всё это вырезается
</VirtualHost>           |
-------------------------*
bla-bla

anonymous
()
Ответ на: комментарий от anonymous

что то у меня не выходит $cat httpd #host3 <VirtualHost 127.0.0.1:80> ServerAdmin xxx@mail.ru ServerName host3 DocumentRoot /home/host3/html ScriptAlias /cgi-bin/ /home/host3/bin/ ErrorLog "|/usr/sbin/dbi.pl host3 " </VirtualHost> #host3 #host4 <VirtualHost 127.0.0.1:80> ServerAdmin xx@mail.ru ServerName host4 DocumentRoot /home/host4/html ScriptAlias /cgi-bin/ /home/host4/bin/ ErrorLog "|/usr/sbin/dbi.pl host4 " </VirtualHost> #host4

я решил отмечать границу между виртностами #hostx теперь мне надо вырезать кусок между 2 hostx вот скрипт которым я это пытаюсь делать #!/usr/bin/perl

open (ht,">>httpd");

while ($a=<ht>) {

if ( $a=~m/#host4.*?#host4/) { print ht ""; } } ~

что я не правильно делаю ?

anonymous
()
Ответ на: комментарий от anonymous

что то у меня не выходит
$cat httpd
#host3
<VirtualHost 127.0.0.1:80>
ServerAdmin xxx@mail.ru
ServerName host3
DocumentRoot /home/host3/html
ScriptAlias /cgi-bin/ /home/host3/bin/
ErrorLog "|/usr/sbin/dbi.pl host3 "
</VirtualHost>
#host3
#host4
<VirtualHost 127.0.0.1:80>
ServerAdmin xx@mail.ru
ServerName host4
DocumentRoot /home/host4/html
ScriptAlias /cgi-bin/ /home/host4/bin/
ErrorLog "|/usr/sbin/dbi.pl host4 "
</VirtualHost>
#host4

я решил отмечать границу между виртностами #hostx
теперь мне надо вырезать кусок между 2 hostx
вот скрипт которым я это пытаюсь делать
#!/usr/bin/perl

open (ht,">>httpd");

while ($a=<ht>) {

if ( $a=~m/#host4.*?#host4/) {
print ht "";
}
}
~

что я не правильно делаю ?

anonymous
()

awk -v p=1 '/<VirtualHost tralilia>/ {p=0} p {print $0} /<\/VirtualHost>/ {p=1}' <fromfile >tofile

Не пойдёт?

K_X_XyHTA
()
Ответ на: комментарий от anonymous

>что я не правильно делаю ?
Единица для обработки регулярным выражением в perl - 1 строка.

#!/usr/bin/perl -w
my $Line='';
open(SRC,"httpd")||die("Can't open file httpd");
while(<SRC>){
	chomp;
	$Line.="$_\t";}
close(SRC);
open(DST,">httpd")||die("Can't open file httpd");
$Line=~s/#host4.*?#host4//g;
$Line=~tr/\t/\n/;
print(DST "$Line");
close(DST);

josephson ★★
()
Ответ на: комментарий от josephson

О! Можно ещё проще.

#!/usr/bin/perl -w
my $Line='';
open(SRC,"httpd")||die("Can't open file httpd");
while(<SRC>){$Line.=$_;}
close(SRC);
open(DST,">httpd")||die("Can't open file httpd");
$Line=~s/#host4.*?#host4//sg;
print(DST $Line);
close(DST);

josephson ★★
()
Ответ на: комментарий от josephson

Большое спасибо , разобрался . красота :)

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.