Wyszukanie i zamiana tekstu w wielu plikach w shell’u bash.


Poniższa porada opisuje, jak w prosty sposób, wykorzystując jednolinijkowe skrypty shell wykonać wyszukanie i zmianę tekstu na inny w wielu plikach tekstowych jednocześnie.

Wykonując audyt statycznych stron internetowych, często muszę wykonać szereg powtarzających się zmian w setkach lub nawet tysiącach plików HTML. Wykonywanie takiej operacji “na piechotę” w każdym s plików po kolei trwałoby kilka tygodni, jednak wcale nie trzeba robić tego w ten sposób. Z pomocą przychodzą skrypty powłoki shell.

Złożone zastąpienia tekstu w wielu plikach jednocześnie można wykonać na wiele sposobów, jednak chyba najprostszym z nich są krótkie, jednolinijkowe skrypty perl. Poniższe przykłady ilustrują sposób pisania takich skryptów.

#dodanie do tytułu każdej strony końcówki " - Pomocnik IT"
perl -pi -w -e 's/<\/TITLE>/ \- Pomocnik IT<\/TITLE>/g;' *.html

#zmiana adresu email z adam@it-pomocnik.org na ania@it-pomocnik.org
perl -pi -w -e 's/adam\@it\-pomocnik\.org/ania\@it\-pomocnik\.org/g;' *.html

Powyższe skrypty edytują wszystkie pliki HTML z bieżącego katalogu. Po drobnej modyfikacji można je oczywiście wykorzystać do modyfikacji plików tekstowych o innych rozszerzeniach. Zwróć uwagę, że przed każdym znakiem specjalnym w zmienianych tekstach należy wstawić znak backslash, aby skrypt traktował je jako część napisu, a nie przełączniki opcji w skrypcie.

, , ,

  1. #1 by Tybek on April 19th, 2008

    >najprostRZym
    LOL :)

  2. #2 by pukas on April 20th, 2008

    o shit ;)

  3. #3 by zenek on May 25th, 2009

    A jak zrobic tak aby skrypt wchodzil we wszystkie podrzedne katalogi i zmienial. Bo przy 100 podkatalogach jest problem.

  4. #4 by squirell on September 12th, 2009

    do zenek:

    find . -type f | while read a
    do
    cat $a | sed -e ’s/\/TITLE>/ \- Pomocnik IT/g’ > $a.tmp
    mv $a.tmp $a
    done

    czyli bashem go ;)

  5. #5 by Kuba on November 20th, 2009

    Ja mam inny problem – w plikach php jakiś wirus nadpisał mi kilkanaście lini kodu na początku każdego pliku. Wygląda to mniej więcej tak:

    (wyciąłem sporo ze środka, żeby nie wydłużać komenta)

    Wiem jak to zdekodować, wyskakuje ukryta ramka z której ładują sie trojany. Jak można to usunąć? Chodzi mi o zapis rekurencyjny (przeryje wszystkie podkatalogi w zadanym katalogu) i wyczyści wszystko pomiędzy . Każdy zapis sie różni, więc chyba jakieś wyrażenie regularne by musiało być. Jak zostanie mi samo to to już łatwo usunę. Proszę o pomoc!

(will not be published)

  1. No trackbacks yet.