Cygal.net.pl

Systemy, Sieci i takie tam :)

Podmiana zadanego cią…gu znaków w plikach.

1
2
3
4
<!-- Begin BidVertiser code --><br />
    <SCRIPT LANGUAGE="JavaScript1.1" SRC="http://bdv.bidvertiser.com/BidVertiser.dbm?pid=478467&#038;bid=1187717" type="text/javascript"></SCRIPT><br />
    <noscript><a href="http://www.bidvertiser.com/bdv/BidVertiser/bdv_publisher.dbm"></a></noscript><br />
    <!-- End BidVertiser code -->

 

Niejednokrotnie zachodzi potrzeba szybkiego zamienienia jakiegoś cią…gu znaków w kilku plikach np. plikach konfiguracyjnych. W przypadku, jeżeli zmiana tak ma zostać, dokona w jednym pliku można z powodzeniem użyć do tego celu swojego ulubionego edytora tekstu np. Vim i użyć polecenia %s/string/STRING/g. Bardzo często zdarza się tak, że tak…ą podmianę musimy wykonać w wielu plikach konfiguracyjnych, zatem powyższy sposób nie jest zbyt wygodny. Lepiej do takiego celu użyć jakiegoś prostego skryptu napisanego np. w Bashu.

1
2
3
4
5
6
7
#!/bin/bash
for file in *.conf
do
 mv $file $file.old
 sed &#39;s/10.0.0.1/192.168.1.1/g&#39; $file.old &gt; $file
 rm $file.old
done

Powyższy skrypt sprawdzi się całkiem dobrze, jeżeli naszych plików, w których chcemy dokonać, zamiany ciągów znaków nie jest dużo. W przypadku np. 10000 plików skrypt ten nie jest optymalny w związku dużą… ilością… operacji kopiowania i usuwania plików. Poniżej przedstawiony jest skrypt napisany w perlu, który zdecydowanie szybciej wykona zamianę cią…gów znaków w plikach.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#!/usr/bin/perl
$stary=&quot;10.0.0.1&quot;;
$nowy=&quot;192.168.1.1&quot;;
$dirname=&quot;/sciezka/do/katalogu&quot;;

opendir ( KATALOG, $dirname ) ;
@pliki = grep { /.conf$/ } readdir KATALOG;
closedir KATALOG;

foreach $plik ( @pliki ){
 open ( file,&quot;&gt;&quot;, $plik );
 @lines = <file> ;

 foreach $linia (@lines){
     if ( $linia =~ $stary ){
         $linia =~ s/$stary/$nowy/;
     }
 }
}
close file;

foreach $plik ( @pliki ){
 open ( file, &quot;&gt;&quot;, $plik );
 print file @lines;
close file;
}

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *


Time limit is exhausted. Please reload CAPTCHA.