Tuesday, September 17, 2024

Linux Sed Regular Expressions

-

Sed (Stream editor) là một công cụ dòng lệnh trong Linux dùng để xử lý văn bản. Sed thường được sử dụng để thực hiện các tác vụ biến đổi văn bản trên nhiều dòng cùng một lúc.

Sed sử dụng các biểu thức chính quy (regular expressions) để tìm kiếm và thay thế các mẫu trong văn bản. Một số các ký tự đặc biệt được sử dụng để biểu diễn các biểu thức chính quy như sau:

  • ^ : ký tự bắt đầu chuỗi
  • $ : ký tự kết thúc chuỗi
  • . : đại diện cho bất kỳ ký tự nào
    • : tìm kiếm 0 hoặc nhiều lần lặp lại
  • [] : tìm kiếm bất kỳ ký tự nằm trong dấu ngoặc vuông
  • [^] : tìm kiếm bất kỳ ký tự không nằm trong dấu ngoặc vuông
  • \ : sử dụng ký tự đặc biệt như ký tự thường

Sed có nhiều tùy chọn để thực hiện các tác vụ biến đổi văn bản, ví dụ:

  • s : tìm kiếm và thay thế các mẫu trong văn bản
  • d : xóa các dòng
  • p : in ra các dòng đã xử lý
  • a : chèn thêm nội dung vào sau các dòng đã xử lý
  • i : chèn thêm nội dung vào trước các dòng đã xử lý

Ví dụ: để thay thế tất cả các chuỗi “apple” thành “orange” trong file “fruits.txt”, sử dụng lệnh sau đây:

sed 's/apple/orange/g' fruits.txt

Ở đây, tùy chọn ‘s’ được sử dụng để tìm kiếm và thay thế. Biểu thức chính quy ‘apple’ được tìm kiếm và thay thế bằng từ ‘orange’. Tùy chọn ‘g’ được sử dụng để thay thế tất cả các chuỗi khớp được tìm thấy trong mỗi dòng.

Ví dụ khác, để xóa tất cả các dòng chứa từ “example” trong file “sample.txt”, sử dụng lệnh sau đây:

sed '/example/d' sample.txt

Ở đây, tùy chọn ‘d’ được sử dụng để xóa các dòng chứa chuỗi “example”.

Stream Editor

Ví dụ

echo interactive | sed 's/inte/dist/'  
echo interactive | sed 's:inte:dist:'  
echo interactive | sed 's_inte_dist_'  
echo interactive | sed 's|inte|dist|'  

Câu lệnh sed được sử dụng để thay thế hoặc xử lý các chuỗi văn bản. Với các ví dụ trên, ta có thể giải thích như sau:

  • echo interactive | sed 's/inte/dist/': Chuỗi “interactive” được đưa qua sed để thực hiện thay thế ký tự “inte” thành “dist”. Kết quả trả về là “distractive”.
  • echo interactive | sed 's:inte:dist:': Tương tự ví dụ trên, nhưng lần này sử dụng dấu hai chấm (:) để phân tách các tham số thay vì dấu gạch chéo (/).
  • echo interactive | sed 's_inte_dist_': Với ví dụ này, ta sử dụng dấu gạch dưới (_) thay vì dấu gạch chéo (/) hoặc dấu hai chấm (:), tuy nhiên chức năng của lệnh không thay đổi.
  • echo interactive | sed 's|inte|dist|': Tương tự ví dụ trước đó, nhưng sử dụng dấu gạch thẳng đứng (|) để phân tách các tham số.

Tất cả các ví dụ này đều sử dụng lệnh sed để thay thế chuỗi “inte” thành “dist” trong chuỗi “interactive”. Bằng cách sử dụng các ký tự khác nhau để phân tách các tham số, ta có thể linh hoạt trong việc sử dụng lệnh sed.

Interactive Editor

Ví dụ:

sed -i 's/today/tomorrow/' file  

Lệnh sed -i 's/today/tomorrow/' file có chức năng thay thế từ “today” bằng từ “tomorrow” trong file được chỉ định (file), và lưu lại các thay đổi trực tiếp vào file đó.

Trong đó:

  • -i là tùy chọn để thay đổi trực tiếp nội dung trong file.
  • 's/today/tomorrow/' là biểu thức thay thế sử dụng Regular Expression, nghĩa là tìm kiếm từ “today” và thay thế bằng từ “tomorrow”.

Ví dụ, nếu file example.txt chứa dòng “Today is a nice day”, khi chạy lệnh sed -i 's/today/tomorrow/' example.txt, nội dung của file sẽ được thay đổi thành “Tomorrow is a nice day”.

Simple Back Referencing

Ví dụ:

echo fourty | sed 's/four/&&/'  

Lệnh sed 's/four/&&/' sử dụng Sed để thay thế một chuỗi con “four” trong chuỗi “fourty” bằng chính chuỗi con “four”, được kết hợp với chính nó bằng phép toán ghép chuỗi (concatenation). Kết quả sẽ là chuỗi “fourfourty”.

Trong đó, “s/” là cú pháp bắt đầu lệnh thay thế, “four” là chuỗi cần được tìm thấy và thay thế, “&&” là back-reference được sử dụng để đề cập đến nội dung của chuỗi cần được tìm thấy, và “/” là ký tự kết thúc lệnh thay thế.

A Dot For Any Character

Ví dụ:

echo xxxx-xx-xx | sed 's/....-..-../YYYY-MM-DD/'  

Lệnh này sử dụng sed để thay thế chuỗi xxxx-xx-xx với chuỗi YYYY-MM-DD. Trong đó, ký tự . biểu thị bất kỳ ký tự nào trong chuỗi.

Vì vậy, khi chạy lệnh này, chuỗi xxxx-xx-xx sẽ được thay thế bởi chuỗi YYYY-MM-DD. Ký tự Y đại diện cho năm, M đại diện cho tháng và D đại diện cho ngày.

Ví dụ: nếu chuỗi đầu vào là 2023-04-04, thì lệnh này sẽ thay đổi nó thành YYYY-MM-DD, nghĩa là chuỗi kết quả sẽ là YYYY-MM-DD.

Multiple Back Referencing

Ví dụ:

echo 2014-06-30 | sed 's/\(....\)-\(..\)-\(..\)/\1:\2:\3/'  
echo 2014-06-30 | sed 's/\(....\)-\(..\)-\(..\)/\1_\2_\3/'  
echo 2014-06-30 | sed 's/\(....\)-\(..\)-\(..\)/\2:\3:\1/'  
echo 2014-06-30 | sed 's/\(....\)-\(..\)-\(..\)/\3:\2:\1/'  

Optional Occurrence

Ví dụ:

cat list2 | sed 's/iii\?/Y/'  

Các lệnh trên đều sử dụng Sed để định dạng lại chuỗi có định dạng ngày tháng (YYYY-MM-DD).

  • Lệnh đầu tiên echo 2014-06-30 | sed 's/\(....\)-\(..\)-\(..\)/\1:\2:\3/' sử dụng ký tự đặc biệt \( \) để tạo các nhóm con trong chuỗi và sau đó thay thế bằng cách sử dụng các ký tự đã được nhóm. Đoạn \1:\2:\3 thay thế chuỗi bằng cách đưa nhóm thứ nhất (....), thứ hai (..), và thứ ba (..) cách nhau bằng dấu :.
  • Lệnh thứ hai echo 2014-06-30 | sed 's/\(....\)-\(..\)-\(..\)/\1_\2_\3/' tương tự lệnh trên nhưng thay dấu : thành dấu _.
  • Lệnh thứ ba echo 2014-06-30 | sed 's/\(....\)-\(..\)-\(..\)/\2:\3:\1/' thay đổi thứ tự các nhóm bằng cách đưa nhóm thứ hai (..) trước, sau đó đến nhóm thứ ba (..) và cuối cùng là nhóm thứ nhất (....), tất cả cách nhau bởi dấu :.
  • Lệnh thứ tư echo 2014-06-30 | sed 's/\(....\)-\(..\)-\(..\)/\3:\2:\1/' đổi vị trí của nhóm thứ hai và thứ ba, cũng tất cả cách nhau bởi dấu :.

Exact n Times Occurence

cat list2 | sed 's/i\{3\}/Y/'  

Lệnh này sử dụng Sed để thay thế chuỗi “iii” hoặc “ii” (i có thể xuất hiện 0 hoặc 1 lần) bằng chuỗi “Y” trong nội dung của file “list2”.

Cụ thể, lệnh trên sẽ đọc nội dung từ file “list2” và thực hiện thay thế chuỗi “iii” hoặc “ii” bằng chuỗi “Y” trong toàn bộ nội dung file đó. Sau đó, nội dung đã được sửa đổi sẽ được hiển thị trên màn hình terminal.

Occurence In Range

Ví dụ:

cat list2 | sed 's/i\{3,4\}/Y/'  

LEAVE A REPLY

Please enter your comment!
Please enter your name here

4,956FansLike
256FollowersFollow
223SubscribersSubscribe
spot_img

Related Stories