Đôi khi chúng ta muốn thay thế văn bản trong một tập tin, ví dụ, thay đổi toàn bộ nội dung "gia đình tôi" thành "chúng tôi" trong tập tin Document.txt . Để làm đ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 (Kate, Gedit, Sublime Text, v.v.), nhưng biết các phương án thay thế, các cách khác để đạt được kết quả tương tự luôn là điều tốt.
Hóa ra, việc này hoàn toàn có thể thực hiện được bằng biểu thức chính quy ; lệnh `sed` thực sự 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 theo cách đơn giản nhất có thể , tôi xin giới thiệu cho bạn biến thể đơn giản hơn nhiều này:
Theo ví dụ trên, ta có tệp Document.txt nằm trong thư mục $HOME/Document.txt với nội dung như sau:
Gia đình tôi cũng giống như bao gia đình khác, như gia đình bạn hay gia đình hàng xóm. Thực tế, gia đình tôi luôn cố gắng sống có trách nhiệm trước xã hội, đúng mực 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à đó chính là vai trò của tôi, haha! Tôi luôn là người không ngại nói ra suy nghĩ của mình (ngay cả khi nó không được xã hội chấp nhận), mặc dù trên thực tế, gia đình tôi đã quá chán ngán với xã hội
hỗn loạnngày nay.
Lệnh sau sẽ thay đổi " gia đình tôi " thành " chúng tôi ":
perl -pi -e "s[mi familia][nosotros]g" $HOME/Documento.txt
Đơn giản vậy thôi
Vì vậy, văn bản sẽ là:
(...) Chúng tôi cũng giống như bao gia đình khác, như gia đình bạn hay gia đình hàng xóm. Thực tế, chúng tôi cố gắng trở thành những người có trách nhiệm trong mắt xã hội, đúng mực 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, haha! Tôi luôn là người không ngại nói ra suy nghĩ của mình (ngay cả khi nó có vẻ không đúng trong mắt xã hội), mặc dù thực tế gia đình tôi đã quá chán ngán với những
điều xấu xacủa 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" …hãy tưởng tượng chữ S cho Bắt đầu và G cho Game Over
- 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ự dài 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à cả một ngôn ngữ
Nếu bạn muốn tìm hiểu thêm, hãy cài đặt gói perl-doc và khám phá tất cả những tính năng mà nó cung cấp; đó thực sự là một thế giới hoàn toàn 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ế 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, giờ đây 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!