Zastąp tekst w plikach jednym poleceniem: perl

Czasami chcemy zamienić tekst w pliku, na przykład zamieniając wszystko, co w pliku Document.txt brzmi „moja rodzina”, na „my” . W tym celu możemy skorzystać z naszego ulubionego edytora tekstu (Kate, Gedit, Sublime Text itp.), ale zawsze warto znać alternatywy i inne sposoby osiągnięcia tego samego rezultatu.

Okazuje się, że przy użyciu wyrażeń regularnych jest to możliwe; polecenie `sed` jest po prostu wspaniałe, ma nieskończoną liczbę wariantów i opcji, ale… dla tych, którzy chcą zastąpić tekst jedynie w najmniej skomplikowany sposób , przedstawiam znacznie prostszą wersję:

Postępując zgodnie z przykładem, mamy plik Document.txt znajdujący się w $HOME/Document.txt i zawierający następujący tekst:

Moja rodzina jest taka sama jak każda inna, jak twoja czy twojego sąsiada. W rzeczywistości moja rodzina stara się być odpowiedzialna w oczach społeczeństwa, politycznie i społecznie poprawna. Jednak w moim domu jest czarna owca i to jest moja rola, LOL! Zawsze byłam tą, która nie boi się mówić, co myślę (nawet jeśli nie jest to społecznie akceptowalne), chociaż tak naprawdę moja rodzina ma dość dzisiejszego zepsutego społeczeństwa.

Poniższe polecenie zmieni „ moja rodzina ” na „ my ”:

perl -pi -e "s[mi familia][nosotros]g" $HOME/Documento.txt

To takie proste 

Tak więc tekst wyglądałby tak:

(…) jesteśmy tacy sami jak wszyscy inni, jak twoi czy twojego sąsiada. W rzeczywistości staramy się być ludźmi odpowiedzialnymi w oczach społeczeństwa, politycznie i społecznie poprawnymi. Jednak w moim domu jest czarna owca i to jest moja rola, LOL! Zawsze byłam tą, która nie boi się mówić, co myślę (nawet jeśli pozornie nie jest to poprawne w oczach społeczeństwa), chociaż w rzeczywistości moja rodzina ma dość brudu współczesnego społeczeństwa.

Składnia jest następująca:

perl -pi -e "s[lo-que-quiero-cambiar][lo-nuevo-a-poner]g" archivo-en-el-cual-reemplazar

Polecenie może wydawać się nieco skomplikowane, rozłóżmy je na części i wyjaśnijmy nieco prościej 

  • Perl : Czego będziemy używać, perl
  • -Liczba Pi : Pí, jak π (przybliżona wartość 3.14)
  • -e : E wyobraź sobie to, aby «e wykonać» ^ - ^
  • Następnie w cudzysłowie » otwieramy za pomocą s i zamykamy za pomocą g: "sg" …wyobraźcie sobie S oznaczające początek i G oznaczające koniec gry 
  • Skręć między sg musimy umieścić dwa zestawy nawiasów: [] y []będąc w ten sposób: „S [] [] g”
  • Wewnątrz pierwszych nawiasów, jak powiedziałem powyżej, zostanie umieszczony tekst, który chcemy usunąć i zastąpić nowym, podczas gdy w drugim zestawie nawiasów zostanie umieszczony nowy tekst do wstawienia, zgodnie z przykładem: „S [moja rodzina] [my] g”

Proste, prawda?

Wyjaśnienie jest w rzeczywistości znacznie dłuższe niż jest to konieczne dla polecenia, jest dość proste do zrozumienia 

Perl to znacznie więcej niż tylko sposób na zastąpienie tekstu, to cały język 

Jeśli chcesz dowiedzieć się więcej, zainstaluj pakiet perl-doc i zapoznaj się ze wszystkimi jego możliwościami. To po prostu zupełnie inny wszechświat.

Przy okazji i na zakończenie, zakładając, że chcesz znaleźć wszystkie pliki .txt, które masz w $ HOME / Documents / i w każdym z nich zamień „moja rodzina” na „nas”, możesz dołączyć do find + perl, aby to osiągnąć:

find $HOME/Documentos/ -name *.txt -exec perl -p -i -e "s[mi familia][nosotros]g" {} \;

Lub używając symbolu wieloznacznego:

perl -p -i -e "s[mi familia][nosotros]g" $HOME/Documentos/*.txt

Problem z tym drugim wariantem polega na tym, że nie zastąpi on plików znajdujących się w podfolderach 

W każdym razie mam nadzieję, że uznałeś to za interesujące. Dla mnie było to naprawdę przydatne, mogę teraz zastępować tekst bezpośrednio z terminala... świetnie! 


Dodaj jako preferowane źródło w Google