Masowa zamiana tekstu 2007-03-12

Zacząłem dzisiaj powoli zmieniać komentarz nagłówkowy we wszystkich plikach php w projekcie. Niestety okazało się to bardzo mozolną pracą. Postanowiłem więc napisać skrypt, który mi w tym pomoże i ku mojemu zaskoczeniu powstał dość szybko, niczego nie popsuł, a czas działania miło mnie zaskoczył (zamiana w kilkudziesięciu plikach nie trwała chyba nawet sekundy).

Przy pisaniu skorzystałem z SPL (Standard PHP Library), a dokładniej klas RecursiveIteratorIterator oraz RecursiveDirectoryIterator. Do zamiany tekstu posłużyła funkcja str_replace().

Tekst, który chcemy zamienić umieszczamy w pliku from, natomiast tekst do zamiany w pliku to. Skrypt uruchamiamy z linii poleceń poprzez komendę.

$ php replace.php

Źródło pliku replace.php

PHP, replace, shell, skrypt, spl, tekst, zamiana, artykuł, blog Techblog, replace, shell, skrypt, spl, tekst, zamiana, artykuł, blog

Słowa kluczowe: PHP, Techblog, replace, shell, skrypt, spl, tekst, zamiana, artykuł, blog

Komentarze i opinie
Michał Górny
2007-03-12 15:32

Jeśli rozumiem, to działa jak:

find /home/sf/public_html/tools/test/ -type f -name '*.php' -exec sed -i -e "s/`cat from`/`cat to`/g" "{}" ';'

Cóż, niektórzy to lubią sobie komplikować życie. Gdybyś chociaż zamiast tych średniowiecznych operacji na ciągach, użył wyrażeń regularnych, to jeszcze…

2007-03-12 15:40

Te "średniowieczne" operacje na ciągach są bardziej uniwersalne :) Poza komentarzami pozmieniałem sobie od razu inne rzeczy.

Co do Twojego skryptu to całkiem możliwe, ale przy próbie przetestowania wyskoczył mi błąd:
sed: -e wyrażenie #1, znak 5: niezakończone polecenie `s'

Michał Górny
2007-03-12 15:42

Nie wiem, co w tym uniwersalnego. Nie zdarzyło mi się spotkać PHP, w którym wyrażenia regularne nie byłyby dostępne. Nawet nie wiem, czy te POSIX-owe można wyłączyć, bo PCRE pewnie tak.

Pisałem tak tylko przykładowo, to moje nie zadziała, jeśli w jednym z plików znajdzie się niewyeskejpowany ukośnik. Byś musiał te ukośniki zastąpić jakimś znakiem, który nie wystąpi w plikach 'from' i 'to', albo wyeskejpować ich wystąpienia.

2007-03-12 15:55

Budowa wyrażenia regularnego zajmuje czas. Natomiast umieszczenie do plików "from" i do pliku "to" tekstów jest o wiele szybsze. Do tego wyrażenia regularne są wolniejsze i raczej nie służą do takiej statycznej zamiany tekstów. Trzeba wiedzieć kiedy używać jakich funkcji, a nie używać czegoś na siłę bo to jest cool.

Michał Górny
2007-03-12 15:58

Jeśli mam być szczery, to jak dla mnie szybsze i pewniejsze jest użycie wyrażenia regularnego, niż pisanie złożonych formułek do zamiany, zastanawiając się, czy może +1, czy może -1 powinno tu być… A akurat nie jestem człowiekiem, który czegoś takiego uczy się na pamięć… a analizowanie kosztuje mnie drogocenny czas.

2007-03-12 16:09

Przygotuję klasę, która będzie zawierać poza aktualną funkcjonalnością dodatkową metodę operującą na wyrażeniach regularnych. Każdy będzie sobie mógł wybrać sposób, który jest mu potrzebny, ale to dopiero za jakiś czas.

Zresztą większość przedstawionych tutaj kawałków kodów zostanie obudowana w klasy i udostępniona.

jaco
2007-03-12 23:03

Heh, uzywajmy wyrazen regularnych bo sa pro, co z tego, ze wymieniamy statyczny fragment tekstu, ze jest to operacja duzo prostsza, duzo szybsza i bezsprzecznie latwiejsza do zaimplementowania (gdzie tu sa jakies -1 ?!). Bezsensowna argumentacja ;) Uzyl wlasciwej funkcji do zamiany, niewlasciwej do sprawdzania rozszezenia ;)

Michał Górny
2007-03-12 23:07

Łech, kurczę, źle spojrzałem. Od początku czepiałem się sprawdzania rozszerzenia ^^.

jaco
2007-03-12 23:23

A jezeli mialbym sie czepiac kodu to warunek jest niezbyt optymalny - zalozmy, ze masz milion plikow gif w strukturze - milion razy sprawdzasz prawa dostepu zeby potem dowiedziec sie, ze to nie plik php ;) Pamietaj, ze przy "and" po napotkaniu false reszta jest pomijana.

2007-03-13 09:50

Iiik. PHP użyte do "sedowania"? :)

(Ale rozumiem, że po prostu tak może być szybciej jeśli PHP zna się lepiej niż narzędzia do obróbki tekstu pod uniksowatymi)

@Stormfly: a tak BTW, to nie używasz żadnego IDE (edytora?), które mogłoby Ci załatwić taki masowy search&replace na wszystkich *.php w projekcie?

2007-03-13 10:02

@Hoppke: chyba jedit ma taką funkcję, ale używam eclipse, który w tej wersji co posiadam nie ma czegoś takiego, a nawet wyszukiwanie zadanego tekstu w projekcie sprawia mu problem (sypie się)

Muszę zaktualizować w końcu to ubuntu ;)

Nowy komentarz
 
 
Projektowanie i tworzenie stron www w PHP5. Opisy i recenzje oprogramowania typu cms, blog, wiki, open source.