Dosyaların içindeki metni tek bir komutla değiştirin: perl

Bazen bir dosya içindeki metni değiştirmek isteyebiliriz; örneğin, Document.txt dosyasındaki "ailemin" yazan her şeyi "bizim" olarak değiştirmek gibi. Bunu yapmak için tercih ettiğimiz metin düzenleyiciyi (Kate, Gedit, Sublime Text vb.) kullanabiliriz, ancak aynı sonucu elde etmenin alternatif yollarını bilmek her zaman iyidir.

Düzenli ifadelerle bunun mümkün olduğu ortaya çıktı ; `sed` komutu gerçekten muhteşem, sonsuz varyasyon ve seçeneğe sahip, ancak… metni mümkün olan en basit şekilde değiştirmek isteyenler için , size çok daha basit bir varyant sunuyorum:

Örneği takip ederek, $HOME/Document.txt konumunda aşağıdaki metni içeren Document.txt dosyamız bulunmaktadır :

Ailem herkesin ailesi gibi, sizin veya komşunuzun ailesi gibi. Aslında, ailem toplumun gözünde sorumlu insanlar olmaya, politik ve sosyal olarak doğru davranmaya çalışıyor. Ancak, evimizde bir kara koyun var ve bu da benim rolüm, LOL! Her zaman düşündüklerimi söylemekten korkmayan kişi oldum (sosyal olarak kabul görmese bile), ancak gerçekte ailem günümüzün bozuk toplumundan bıkmış durumda.

Aşağıdaki komut " my family " ifadesini " us " olarak değiştirecektir :

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

Bu kadar basit 

Böylece metin şöyle olacaktır:

(...) Biz de herkes gibiyiz, sizin veya komşunuzun ailesi gibi. Aslında, toplumun gözünde sorumlu insanlar olmaya, politik ve sosyal olarak doğru davranmaya çalışıyoruz . Ancak, evimde bir kara koyun var ve bu da benim rolüm, LOL! Her zaman düşündüklerimi söylemekten korkmayan kişi oldum (toplumun gözünde doğru görünmese bile), oysa gerçekte ailem günümüz toplumunun pisliğinden bıkmış durumda.

Sözdizimi şöyledir:

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

Komut biraz karmaşık görünebilir, gelin biraz parçalara ayıralım ve biraz daha basit bir şekilde açıklayalım 

  • perl : Ne kullanacağız, perl
  • -pi : Pí, nasıl π (yaklaşık 3.14 değeri)
  • -e : E bunu "e yürütmek için" hayal eder ^ - ^
  • Sonra tırnak içinde » ile açıyoruz s ve bir ile kapatıyoruz g: "sg" …Başlangıç ​​için S'yi ve Oyun Bitti için G'yi hayal edin 
  • Arasında dönün sg iki küme parantez koymalıyız: [] y []bu şekilde olmak: "S [] [] g"
  • Yukarıda söylediğim gibi ilk parantezlerin içinde, kaldırmak ve yenisiyle değiştirmek istediğimiz metin, ikinci parantez kümesinde ise yeni metin aşağıdaki örnekte yer alacaktır: "S [ailem] [biz] g"

Basit değil mi?

Açıklama aslında komut için gerekenden çok daha uzun, anlaşılması oldukça basit 

Perl, metni değiştirmenin bir yolundan çok çok daha fazlasıdır; bütün bir dildir 

Bu konu hakkında daha fazla bilgi edinmek isterseniz, perl-doc paketini kurun ve sunduğu her şeye göz atın; tamamen farklı bir dünya.

Bu arada ve kapatmak için, $ HOME / Documents / içindeki tüm .txt dosyalarını bulmak ve her birinde "ailem" i "biz" ile değiştirmek istediğinizi varsayarak, bunu başarmak için find + perl'e katılabilirsiniz:

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

Veya bir joker karakter kullanarak:

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

Bu ikinci değişkenin sorunu, alt klasörlerdeki dosyaların yerini almamasıdır 

Neyse, umarım bunu ilginç bulmuşsunuzdur. Benim için gerçekten çok faydalı oldu, artık metni doğrudan terminalden değiştirebiliyorum... harika! 


Google'da tercih edilen kaynak olarak ekleyin.