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

Belirli durumlarda, bir dosyadaki metni değiştirmek isteriz, örneğin, Document.txt "ailemin" "bizim" için söylediği her şey. Bunu başarmak için tercih ettiğimiz metin düzenleyicimizi (Kate, Gedit, SublimeText, vb.) Kullanabiliriz ancak aynı sonucu elde etmenin diğer yollarını ve varyantları bilmek her zaman iyidir 🙂

İle olur düzenli ifadeler bu elde edilebilir, sed komutu tek kelimeyle muhteşemdir, sonsuz varyantları ve seçenekleri vardır ama ... sadece metinden metin değiştirmek isteyenler için mümkün olan en az karmaşık yol, onlar için şu çok daha basit varyantı getiriyorum:

Örneği takiben, dosyamız var Document.txt bulunan $ HOME / Document.txt aşağıdaki metin ile:

(...) ailem hepsi gibi, sizin veya komşunuzunki gibi. Aslında ailem Sorumlu insanlar olmaya ve toplumun gözünde politik ve sosyal açıdan doğru olmaya çalışıyoruz. Ancak, evimde kara koyun var ve bu benim rolüm LOL! Gerçekte ailem bıkmış olsa da (toplumun gözünde görünüşte doğru olmasa da) ne düşündüğünü söylemekten korkmayan her zaman bendim. kir Bugünün toplumu.

Aşağıdaki komutla değiştireceksiniz «ailem" tarafından "bize":

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

Bu kadar basit 🙂

Böylece metin şöyle olacaktır:

(...) bize hepsi gibi, sizin veya komşunuzunki gibi. Aslında bize Sorumlu insanlar olmaya ve toplumun gözünde politik ve sosyal açıdan doğru olmaya çalışıyoruz. Ancak, evimde kara koyun var ve bu benim rolüm LOL! Gerçekte ailem bıkmış olsa da (toplumun gözünde görünüşte doğru olmasa da) ne düşündüğünü söylemekten korkmayan her zaman bendim. kir Bugünün toplumu.

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, hadi biraz parçalayalı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ğinde G'yi Düşünün 😀
  • 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 kapsamlı, anlaşılması oldukça basit

Perl, metni değiştirmenin bir yolundan çok daha fazlasıdır, tam bir dildir 😉

Daha fazlasını öğrenmek istiyorsanız paketi kurun perl-doc ve whooodo'nun neye izin verdiğine bir bakın, bu sadece farklı bir evren.

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 varyantla ilgili sorun, alt klasörlerdeki dosyalarda değiştirilmemesidir 🙂

Her neyse, umarım ilginç bulmuşsundur. Benim için gerçekten yararlı oldu, metni doğrudan terminalden değiştirebiliyorum ... harika! 😀


21 yorum, sizinkini bırakın

Yorumunuzu bırakın

E-posta hesabınız yayınlanmayacak. Gerekli alanlar ile işaretlenmiştir *

*

*

  1. Verilerden sorumlu: Miguel Ángel Gatón
  2. Verilerin amacı: Kontrol SPAM, yorum yönetimi.
  3. Meşruiyet: Onayınız
  4. Verilerin iletilmesi: Veriler, yasal zorunluluk dışında üçüncü kişilere iletilmeyecektir.
  5. Veri depolama: Occentus Networks (AB) tarafından barındırılan veritabanı
  6. Haklar: Bilgilerinizi istediğiniz zaman sınırlayabilir, kurtarabilir ve silebilirsiniz.

  1.   patlama dijo

    Sanırım çoğumuz aynı amaca hizmet eden sed komutunu biliyoruz, çok daha iyi yapıyor ve kullanımı daha kolay ...

    1.    KZKG ^ Gaara dijo

      Yorumun için teşekkürler,
      Sadece iki ayrıntı, neden sed'in onu daha iyi hale getirdiğini söylüyorsunuz? Bu kadar çok 'tuhaf' karakterle kullanmak gerçekten daha mı kolay?

  2.   Federico A. Valdes Toujague dijo

    Herkese selamlar!!!. Komutu kullandım susuzlukve burada perl ile açıklanan yöntem daha basittir. Teşekkürler KZKG ^ Gaara !!!.

    1.    KZKG ^ Gaara dijo

      Yorum için teşekkürler 🙂
      En azından bana öyle geliyor ki bu normal ifadelerden daha basit ... o kadar çok 'tuhaf' karakterle, anlayamayanlara anlamak ve öğrenmek gerçekten karmaşık bir şey yapılabilir.

      1.    Giskard dijo

        Orada «eski» bir atasözü var: «Bir sorun yaşadım, Normal İfadeler kullanmaya karar verdim ... şimdi İKİ sorunum var» 😉

        1.    KZKG ^ Gaara dijo

          HAHAHAHAHAHAHA !!!
          Düzenli ifadeler hayatımızı belli bir noktada kurtarabilir ... evet, onları kullanmayı öğrenmek ve uğraşırken ölmemek uzun zaman alır.

          Bu emri yıllar önce bilseydim, ALLAH !! hayatım ne kadar basit olurdu 😀

          1.    Giskard dijo

            Açık! İyi ele alındığında çok güçlüler very Metni değiştirmek için daha iyi bir şey yok. Ancak bazen, bu durumda Perl'de de söylediğiniz gibi, bir değiştirme yeterliyse o kadar ileri gitmeniz gerekmez.
            Yine de Python kullanırdım :)

    2.    dhunter dijo

      Ama susuzlukta bunu daha da basit görüyorum ... Yanlış bir şey mi yapıyorum?

      sed -i "evet / ne-değiştirmek-istiyorum / yeni-koymak /" değiştirmek için-dosya

      1.    KZKG ^ Gaara dijo

        heh heh ... ve "http://my.blog.com/content/" öğesini "http://my.blog.com/uploads/files/" ile değiştirmek istersem 😀 ... zaten orada boşluklar ve diğerleri ile \ koymak ve karmaşık hale gelir mi, değil mi?

        1.    dhunter dijo

          Ayırıcı olarak / kullanılması zorunlu değildir. + İle bak

          sed -i «s + http: //my.blog.com/content/+http: //my.blog.com/uploads/files/+» dosyası

          1.    KZKG ^ Gaara dijo

            O_O… WTF!
            Şimdi benim için bütün bir seçenekler evrenini açtınız .. O_O

          2.    Giskard dijo

            Hepimizin bir şeyler öğrendiği bu gönderileri seviyorum 🙂
            Ben de bilmiyordum.

  3.   RAW-Temel dijo

    Doğrudan vi kullanmayı tercih ederim ..

    Kadar basit:
    :% s / biz / ailem / g

    % -> tüm belge
    s -> arama
    g -> tüm olaylar

    Selamlar ..

    1.    KZKG ^ Gaara dijo

      Teşekkürler!
      Vi ile nasıl yapılacağını bilmiyordum

  4.   st0rmt4il dijo

    Sık kullanılanlara eklendi!

    Teşekkürler!

  5.   DuranG dijo

    Harika giriş! Birinin ilgilenmesi durumunda, Linux sed komutuyla aynı: http://www.sysadmit.com/2015/07/linux-reemplazar-texto-en-archivos-con-sed.html

    1.    Şüphe dijo

      Ve dosyanın içinde değiştirmek istediğim şeyin tırnak işaretleri varsa ne olur?
      Örnek, metin yazan şeyi değiştirin: »1 ″ metinle:» 2 ″
      komut nasıl olurdu?

  6.   Percy salgado'su dijo

    Merhaba

    Ortasında @ olan bir dizeyi değiştirmek istedim ve metni yalnızca öncesiyle değiştirdim.

    değiştirilecek metin: Yaşasın Peru
    yeni metin: Viva mi patria @percysalgado
    Gösterilen: Çok yaşa vatanım

    Yardımınız için teşekkürler

  7.   anonim dijo

    "\" @, # Çift kullanımlı karakterlerden önce bölü çizgisini kullanmanız gerekir, böylece metin olarak yorumlanırlar.

  8.   Gaba dijo

    Ve bunu pencerelerde nasıl yaparım ????