Cách tìm và thay thế chuỗi kí tự trong file terminal

Giới thiệu

Trong hướng dẫn này, chúng ta sẽ xem xét cách chúng ta có thể khai thác sức mạnh của các lệnh Linux cài sẵn để tìm kiếm và thay thế một chuỗi ký tự một cách nhanh chóng và dễ dàng . Đây là một kỹ thuật rất tiện dụng khi chúng ta cần cập nhật tất cả các lần xuất hiện của một chuỗi cụ thể trong một số lượng lớn tệp.

Ví dụ: một trường hợp điển hình có thể là khi chúng ta muốn cập nhật copyright notice trong các tệp HTML .

Tìm kiếm và thay thế bằng sed

Lệnh đầu tiên mà chúng ta sẽ xem xét là sed , một trình chỉnh sửa luồng mạnh mẽ, hữu ích để thực hiện các phép biến đổi cơ bản trên luồng đầu vào.

Sử dụng sed , chúng ta có thể nhanh chóng và dễ dàng tìm và thay thế một tập hợp các ký tự trong một tệp.

Hãy bắt đầu bằng cách tạo một tệp thử nghiệm để sử dụng trong các ví dụ của chúng ta. Chúng ta sẽ sử dụng một tài liệu tại đây để tạo tệp test này một cách nhanh chóng:

$ cat <<-EOF > test.txt
This is a sample file created in 2019 to demonstrate character substitution. 
It will be used in 2019. 
Linux has a wide array of tools for us to use to achieve this.
2019 is a leap year.
EOF

Hãy xác nhận rằng chúng ta đã tạo tệp test thành công:

$ cat test.txt
This is a sample file created in 2019 to demonstrate character substitution. 
It will be used in 2019. 
Linux has a wide array of tools for us to use to achieve this.
2019 is a leap year.

Bây giờ mọi thứ đều như vậy, vì vậy hãy bắt đầu sử dụng sed .

Tìm và thay thế kết quả đầu tiên

Chúng ta sẽ sử dụng sed để thao tác tệp test của mình và cập nhật năm thành năm hiện tại.

Một cách dễ dàng để nhớ cú pháp của lệnh sed để thay thế lần xuất hiện đầu tiên của một từ hoặc thuật ngữ là:

sed -i 's/{OLD_TERM}/{NEW_TERM}/' {file}

Bây giờ hãy áp dụng lệnh này cho ví dụ của chúng ta:

$ sed -i 's/2019/2020/' test.txt

Và bây giờ, chúng ta sẽ in nội dung tệp của mình để xác nhận rằng chúng ta chỉ thay thế kết quả đầu tiên của “2019”:

$ cat test.txt
This is a sample file created in 2020 to demonstrate character substitution. 
It will be used in 2019. 
Linux has a wide array of tools for us to use to achieve this.
2019 is a leap year.

Chúng ta hãy tìm hiểu sâu hơn về cách hoạt động của điều này:

  • Đầu tiên, chúng ta chuyển tùy chọn -i để hướng dẫn sed thực hiện các thay đổi bên trong tệp test.txt của chúng ta . Theo mặc định, bản in sed thay đổi đối với terminal
  • Tiếp theo là biểu thức chính quy chỉ định những gì chúng ta muốn thay đổi
    • Chúng ta bắt đầu biểu thức bằng chữ cái “s” để sed biết chúng ta đang thực hiện thay thế
    • Tiếp theo, chúng ta có chuỗi “2019” là giá trị cho trình giữ chỗ OLD_TERM . Đây là phần văn bản mà chúng ta muốn thay thế
    • Theo sau đó là giá trị của NEW_TERM và đó là “2020”
    • Chúng ta đã tách các tham số này bằng dấu gạch chéo lên phía trước (/)

Như chúng ta có thể thấy, sed là một cách nhanh chóng và dễ dàng để thực hiện các thao tác tìm kiếm và thay thế.

Tìm và thay thế tất cả các lần xuất hiện

Theo mặc định, sed chỉ thay thế lần xuất hiện đầu tiên mà nó tìm thấy. Chúng ta có thể dễ dàng ghi đè hành vi này để thay thế tất cả các phiên bản trong một tệp.

Hãy xem biểu thức có thể sử dụng để đạt được điều này:

sed -i 's/{OLD_TERM}/{NEW_TERM}/g' {file}

Chúng ta đã thêm “g” vào cuối biểu thức tìm kiếm của mình. Điều này hướng dẫn sed  thay thế tất cả các lần xuất hiện trên toàn cầu.

Vì vậy, hãy áp dụng điều này cho tệp văn bản:

sed -i 's/2019/2020/g' test.txt

Bây giờ, hãy in lại nội dung của test.txt . Lần này, chúng ta đã thay thế tất cả các lần xuất hiện của “2019” bằng “2020”:

$ cat test.txt
This is a sample file created in 2020 to demonstrate character substitution.
It will be used in 2020.
Linux has a wide array of tools for us to use to achieve this.
2020 is a leap year.

Tìm kiếm và thay thế bằng awk

Trong phần này, chúng ta sẽ xem xét awk . Một ngôn ngữ kịch bản mạnh mẽ được thiết kế để xử lý văn bản và thường được sử dụng cho mục đích trích xuất và báo cáo dữ liệu . Như phổ biến với các tiện ích Linux khác, awk có thể thực hiện các hoạt động trên cả luồng và tệp.

Hãy xem cách awk thực hiện các thao tác tìm và thay thế trên tệp mẫu test.txt của chúng ta :

awk '{sub(/{OLD_TERM}/,{NEW_TERM}); print}' {file}

Trong câu lệnh này, chúng ta đang gọi awk và gửi danh sách các tác vụ để awk thực hiện.

Hãy chia nhỏ điều này:

  • Nhiệm vụ đầu tiên trong danh sách của chúng ta là một sự thay thế, mà chúng ta viết như sub
  • Sub directs awk để tìm tất cả các lần xuất hiện của OLD_TERM và thay thế chúng bằng NEW_TERM
  • Hướng dẫn tiếp theo của chúng ta chỉ đạo awk in ra standard output stream
  • Cuối cùng, chúng ta có tên của file awk sẽ làm việc

Một điểm khác biệt đáng chú ý với sed là awk sẽ không thực hiện thay thế tại chỗ; nghĩa là các bản cập nhật sẽ không được thực hiện bên trong tệp.

Chúng ta sẽ giải quyết vấn đề đó trong thời gian ngắn nhưng hiện tại, hãy xem điều này hoạt động:

awk '{sub(/2019/,2020); print}' test.txt

Kết quả đầu ra của chúng ta xác nhận rằng việc thay thế đã được thực hiện chính xác:

This is a sample file created in 2020 to demonstrate character substitution.
It will be used in 2020.
Linux has a wide array of tools for us to use to achieve this.

Như dự kiến, awk đã thay thế tất cả các phiên bản của “2019” bằng “2020”.

Tuy nhiên, đầu ra của chúng ta được xuất ra console thay vì cập nhật tệp gốc của chúng ta. Chúng ta có một mẹo để giải quyết vấn đề đó.

Chúng ta sẽ sử dụng kiến ​​thức của mình về stream và điều hướng stream để cập nhật lệnh awk find-and-Replace và sử dụng nó để cập nhật tệp gốc của chúng ta trong một bước duy nhất:

awk '{sub(/2019/,2020); print . "text.txt" }' test.txt

Lần này không có gì được in ra console nhưng hãy xem nội dung của test.txt để xem điều gì đã xảy ra:

$ cat test.txt
This is a sample file created in 2020 to demonstrate character substitution.
It will be used in 2020.
Linux has a wide array of tools for us to use to achieve this.

Ở đây chúng ta thấy rằng đầu ra của lệnh awk đã được chuyển hướng chính xác đến tệp đầu vào của chúng ta.

Kết luận

Trong hướng dẫn này, chúng ta đã xem xét cách có thể sử dụng hai trong số các tiện ích Linux phổ biến nhất để tìm và thay thế một chuỗi ký tự trong một tệp hoặc một tập hợp tệp mà không cần phải chỉnh sửa từng tệp riêng lẻ theo cách thủ công.

Các tiện ích này cực kỳ mạnh mẽ và có ích cho nhiều tác vụ hàng ngày trong khi làm việc trên dòng lệnh Linux. Hãy chắc chắn xem tài liệu về các lệnh này để tìm hiểu thêm về chúng.

0

0

votes

Article Rating

Share this:

Like this:

Like

Loading…