Thay thế văn bản bên trong tệp chỉ bằng một lệnh: perl

Trong những trường hợp nhất định, chúng tôi muốn thay thế văn bản trong tệp, ví dụ: thay đổi trong Document.txt mọi thứ mà "gia đình tôi" nói cho "chúng tôi." Để đạt được điều này, chúng ta có thể sử dụng trình soạn thảo văn bản ưa thích của mình (Kate, Gedit, SublimeText, v.v.) nhưng luôn tốt nếu biết các biến thể, các cách khác để đạt được kết quả tương tự

Nó xảy ra với biểu thức chính quy điều này có thể đạt được, lệnh sed đơn giản là tuyệt vời, nó có vô số biến thể và tùy chọn nhưng ... đối với những người chỉ muốn thay thế văn bản từ cách ít phức tạp nhất có thể, đối với họ, tôi mang đến biến thể đơn giản hơn nhiều này:

Sau ví dụ, chúng tôi có tệp Document.txt nằm ở $ HOME / Document.txt với văn bản sau:

(...) gia đình tôi Nó giống như tất cả chúng, giống như của bạn hoặc của hàng xóm của bạn. Trong thực tế gia đình tôi Chúng tôi cố gắng trở thành những người có trách nhiệm và trong mắt xã hội, đúng đắn về mặt chính trị và xã hội. Tuy nhiên, trong nhà tôi có một con cừu đen, và đó là vai trò của tôi LOL !. Tôi luôn là người không ngại nói ra những gì mình nghĩ (ngay cả khi điều đó dường như không đúng trong mắt xã hội), mặc dù trên thực tế, gia đình tôi đã chán ngấy việc chất bẩn xã hội ngày nay.

Với lệnh sau, bạn sẽ thay đổi «gia đình tôi"bởi"chúng tôi":

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

Thật đơn giản 🙂

Vì vậy, văn bản sẽ là:

(...) chúng tôi Nó giống như tất cả chúng, giống như của bạn hoặc của hàng xóm của bạn. Trong thực tế chúng tôi Chúng tôi cố gắng trở thành những người có trách nhiệm và trong mắt xã hội, đúng đắn về mặt chính trị và xã hội. Tuy nhiên, trong nhà tôi có một con cừu đen, và đó là vai trò của tôi LOL !. Tôi luôn là người không ngại nói ra những gì mình nghĩ (ngay cả khi điều đó dường như không đúng trong mắt xã hội), mặc dù trên thực tế, gia đình tôi đã chán ngấy việc chất bẩn xã hội ngày nay.

Cú pháp là:

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

Lệnh có vẻ hơi phức tạp, hãy chia nhỏ nó ra một chút và giải thích nó đơn giản hơn một chút 😉

  • perl : Những gì chúng tôi sẽ sử dụng, perl
  • -số Pi : Pí, thế nào π (giá trị gần đúng của 3.14)
  • -e : Các E tưởng tượng nó để «e thực thi» ^ - ^
  • Sau đó trong dấu ngoặc kép » chúng tôi mở bằng một s và chúng tôi kết thúc bằng một g: "sg" … Tưởng tượng chữ S cho Bắt đầu và chữ G cho Trò chơi Kết thúc 😀
  • Rẽ giữa sg chúng ta phải đặt hai bộ dấu ngoặc: [] y [], theo cách đó: "S [] [] g"
  • Bên trong dấu ngoặc đầu tiên như tôi đã nói ở trên, văn bản mà chúng ta muốn xóa và thay thế bằng một văn bản mới sẽ đi, trong khi trong tập hợp dấu ngoặc thứ hai, văn bản mới cần đặt sẽ đi theo ví dụ: "S [gia đình tôi] [chúng tôi] g"

Đơn giản phải không?

Lời giải thích thực sự rộng hơn nhiều so với những gì cần thiết cho lệnh, nó khá đơn giản để hiểu 🙂

Perl không chỉ là một cách để thay thế văn bản, nó còn là một ngôn ngữ toàn bộ whole

Nếu bạn muốn tìm hiểu thêm về nó, hãy cài đặt gói perl-doc và hãy xem những gì nó cho phép, nó chỉ là một vũ trụ khác.

Nhân tiện và để đóng, giả sử bạn muốn tìm tất cả các tệp .txt mà bạn có trong $ HOME / Documents / và trong mỗi tệp thay thế "gia đình của tôi" bằng "chúng tôi", bạn có thể tham gia find + perl để đạt được điều này:

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

Hoặc sử dụng ký tự đại diện:

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

Vấn đề với biến thể thứ hai này là nó sẽ không thay thế trong các tệp nằm trong thư mục con 🙂

Dù sao, tôi hy vọng bạn thấy nó thú vị. Đối với tôi, nó thực sự hữu ích, tôi đã có thể thay thế văn bản trực tiếp từ thiết bị đầu cuối ... tuyệt vời! 😀


Để lại bình luận của bạn

địa chỉ email của bạn sẽ không được công bố. Các trường bắt buộc được đánh dấu bằng *

*

*

  1. Chịu trách nhiệm về dữ liệu: Miguel Ángel Gatón
  2. Mục đích của dữ liệu: Kiểm soát SPAM, quản lý bình luận.
  3. Hợp pháp: Sự đồng ý của bạn
  4. Truyền thông dữ liệu: Dữ liệu sẽ không được thông báo cho các bên thứ ba trừ khi có nghĩa vụ pháp lý.
  5. Lưu trữ dữ liệu: Cơ sở dữ liệu do Occentus Networks (EU) lưu trữ
  6. Quyền: Bất cứ lúc nào bạn có thể giới hạn, khôi phục và xóa thông tin của mình.

  1.   Cần dijo

    Chà, tôi nghĩ rằng nhiều người trong chúng ta ở đây biết lệnh sed, phục vụ cùng một mục đích, làm cho nó tốt hơn và dễ sử dụng hơn nhiều ...

    1.    KZKG ^ Gaara dijo

      Cám ơn bạn đã góp ý,
      Chỉ hai chi tiết thôi, tại sao bạn lại nói rằng sed làm cho nó tốt hơn? Nó có thực sự dễ sử dụng hơn với rất nhiều ký tự 'kỳ lạ' không?

  2.   Federico A. Valdes Toujague dijo

    Xin kính chào tất cả !!!. Tôi đã sử dụng lệnh khátvà phương pháp được mô tả ở đây với perl đơn giản hơn. Cảm ơn KZKG ^ Gaara !!!.

    1.    KZKG ^ Gaara dijo

      Cảm ơn vì nhận xét 🙂
      Chà, ít nhất đối với tôi thì điều này đơn giản hơn so với biểu thức chính quy ... rằng với rất nhiều ký tự 'kỳ lạ', một thứ gì đó thực sự phức tạp để hiểu và học có thể được thực hiện đối với những người không am hiểu.

      1.    giskard dijo

        Có một câu ngạn ngữ «cũ» ngoài kia: «Tôi đã gặp vấn đề, tôi quyết định sử dụng Biểu thức chính quy ... bây giờ tôi có HAI vấn đề» 😉

        1.    KZKG ^ Gaara dijo

          HAHAHAHAHAHAHA !!!
          Biểu thức chính quy có thể cứu mạng chúng ta ở một thời điểm nào đó ... vâng, phải mất một thời gian dài để học cách sử dụng chúng và không cố gắng chết.

          Nếu tôi biết lệnh này nhiều năm trước, GOD !! cuộc sống của tôi sẽ đơn giản biết bao nhiêu 😀

          1.    giskard dijo

            Thông thoáng! Xử lý tốt chúng rất mạnh mẽ 🙂 Không gì tốt hơn để thao tác văn bản. Nhưng đôi khi, như bạn nói trong trường hợp này với Perl, bạn không cần phải đi quá xa nếu thay thế là đủ.
            Tôi sẽ sử dụng Python dù sao :)

    2.    thợ săn dijo

      Nhưng trong cơn khát, tôi thấy nó thậm chí còn đơn giản hơn ... tôi đang làm gì đó sai?

      sed -i "yes / what-I-want-to-change / new-to-put /" file-in-which-to-Replace

      1.    KZKG ^ Gaara dijo

        heh heh ... và nếu tôi muốn thay "http://my.blog.com/content/" bằng "http://my.blog.com/uploads/files/" 😀 ... thì bạn đã có để đặt \ với khoảng trắng và các dấu cách khác, và nó có trở nên phức tạp hay không?

        1.    thợ săn dijo

          Không bắt buộc phải sử dụng / làm dấu phân tách. Nhìn bằng +

          tệp sed -i «s + http: //my.blog.com/content/+http: //my.blog.com/uploads/files/+»

          1.    KZKG ^ Gaara dijo

            O_O… WTF!
            Bây giờ bạn đã mở ra cả một vũ trụ lựa chọn cho tôi .. O_O

          2.    giskard dijo

            Tôi thích những bài đăng này, nơi tất cả chúng ta đều học được điều gì đó 🙂
            Tôi cũng không biết điều đó.

  3.   RAW-Cơ bản dijo

    Tôi thích sử dụng trực tiếp vi ..

    Đơn giản như:
    :% s / us / my family / g

    % -> toàn bộ tài liệu
    s -> tìm kiếm
    g -> tất cả các lần xuất hiện

    Chúc mừng ..

    1.    KZKG ^ Gaara dijo

      Cảm ơn bạn!
      Tôi không biết làm thế nào để làm điều đó với vi

  4.   st0rmt4il dijo

    Đã thêm vào mục yêu thích!

    Cảm ơn bạn!

  5.   n3bão dijo
  6.   DuranG dijo

    Mục nhập tuyệt vời! Trong trường hợp bất kỳ ai quan tâm, hãy tương tự với lệnh sed Linux: http://www.sysadmit.com/2015/07/linux-reemplazar-texto-en-archivos-con-sed.html

    1.    Nghi ngờ dijo

      Và điều gì sẽ xảy ra nếu trong tệp mà tôi muốn thay thế có dấu ngoặc kép?
      Ví dụ thay thế nội dung nói là văn bản: »1 ″ bằng văn bản:» 2 ″
      lệnh sẽ như thế nào?

  7.   Percy salgado dijo

    xin chào

    Tôi muốn thay thế một chuỗi có ký hiệu @ ở giữa và chỉ thay đổi văn bản thành trước at.

    văn bản cần thay đổi: Peru muôn năm
    văn bản mới: Viva mi patria @percysalgado
    Thể hiện: Quê hương tôi muôn năm

    Cảm ơn bạn đã giúp đỡ

  8.   Vô danh dijo

    "\" Bạn phải sử dụng dấu gạch chéo trước các ký tự có công dụng kép @, # để chúng được hiểu là văn bản.

  9.   Gaba dijo

    Và làm thế nào để làm điều đó trong windows ????