Hướng dẫn mới bắt đầu cho Sed [Linux]
Sau grep, bước hợp lý tiếp theo là hướng dẫn về sed. Lệnh sed xuất phát từ Stream EDitor, và như tên gọi của nó, nó đề cập đến thông lượng văn bản. Tuy nhiên, nếu sed là một trong những lệnh mạnh nhất trong Unix, trang hướng dẫn của nó cũng nằm trong số những bí ẩn nhất. Tôi sẽ cố gắng trong bài viết này để tóm tắt cách sử dụng cơ bản nhất của sed và sau đó cung cấp cho bạn một vài ví dụ về các kịch bản nâng cao.
Khái niệm cơ bản
Lệnh chung cho sed là một cái gì đó như:
sed [tùy chọn] '{script}' [tệp văn bản]
Sed sẽ thực hiện các thao tác mà bạn muốn anh ta thực hiện trên tệp văn bản và hiển thị kết quả trong đầu ra tiêu chuẩn. Nếu bạn muốn kết quả trong một tệp văn bản, bạn có thể chuyển hướng nó qua phương pháp thường dùng:
sed [tùy chọn] '{script}' [tệp văn bản]> [tệp văn bản đã chỉnh sửa]
Hoặc sử dụng tùy chọn “ -i
” để chỉnh sửa trực tiếp tệp đầu vào:
sed -i [tùy chọn] '{script}' [tệp văn bản]
Bây giờ chúng ta hãy bắt đầu làm việc trên kịch bản. Bước đầu tiên rõ ràng nhất là kịch bản null:
sed '' test.txt
sẽ chỉ hiển thị văn bản trong tệp test.txt.
Sử dụng tốt sed là xóa. Hãy thực hành thông qua các ví dụ.
sed '2, 4 d' test.txt
sẽ xóa các dòng từ 2 đến 4 của test.txt.
Bạn có thể đoán rằng cú pháp cho tập lệnh là:
sed '[dòng đầu tiên để xóa] [dòng cuối cùng để xóa] d' test.txt
Nhưng phần ưa thích xuất hiện khi bạn sử dụng cụm từ thông dụng hoặc regex, làm dấu phân cách để xóa. Ví dụ,
sed '/ ^ # / d' test.txt
sẽ xóa mọi dòng bắt đầu bằng “#” (nói cách khác, nếu bạn viết mã, nó sẽ xóa tất cả các nhận xét của bạn).
Cú pháp chung là
sed '/ regex / d' test.txt
để xóa dòng chứa regex.
sed '/ regex1 /, / regex2 / d' test.txt
để xóa khoảng thời gian từ dòng chứa regex1 đến dòng chứa regex2.
Ký tự đặc biệt “^” mà tôi đã sử dụng trong ví dụ đầu tiên là cho biết phần đầu của dòng.
Sau đó, cách sử dụng cơ bản thứ hai mà tôi có thể nghĩ là thay thế. Cú pháp chung là:
sed -re 's / regex1 / regex2 /' test.txt
Nó sẽ có hiệu lực để tìm kiếm trong dòng đầu tiên cho regex1, thay thế nó bằng regex2, đi đến dòng tiếp theo và lặp lại cho đến khi kết thúc của thông lượng nhập.
Một ví dụ tốt là:
sed -re 's / ^ # * //' test.txt
Nó sẽ thay thế ký hiệu “#” ở đầu dòng, và tất cả các khoảng trống đều không có gì. Nói cách khác, nó bỏ ghi chú tập tin văn bản. Ký hiệu “*” là ký tự meta thiết kế 0 hoặc nhiều khoảng trống ở đây.
Nâng cao
Bạn có thể làm một số công cụ khá lạ mắt với sed, nhưng bạn sẽ đạt đến giới hạn khá nhanh nếu bạn không chú ý đến hành vi cơ bản của nó. Sed đề cập với thông lượng tuyến tính: Nó áp dụng điều trị từng dòng cho một tệp văn bản. Nếu bạn muốn thực hiện nhiều sửa đổi cho cùng một dòng, bạn phải sử dụng nhãn và xử lý đa dòng. Tất cả điều này có thể trở nên rất phức tạp, rất nhanh chóng. Bây giờ tôi sẽ cho bạn thấy một vài ví dụ tiên tiến và giải thích chúng cho bạn. Nếu bạn muốn nhiều hơn, tôi chắc chắn rằng bạn có thể tìm kiếm một mình và sử dụng những điều cơ bản tôi đã cho bạn.
Nếu bạn muốn xóa các dòng trống của một tệp, bạn có thể sử dụng lệnh
sed -re '/ ^ $ / {N; D} 'test.txt
Ký tự meta “$” có nghĩa là kết thúc của dòng, do đó “^ $” thiết kế một dòng trống. Sau đó, “{N; D}” là một cú pháp khá phức tạp để nói rằng xóa dòng đó.
Nếu bạn muốn xóa từng thẻ trong một tệp html, đây là lệnh cho bạn:
sed -re ': bắt đầu s /] *> // g; /": Bắt đầu" được gọi là nhãn. Nó giống như một thẻ trong tập lệnh mà chúng tôi muốn quay lại sau để áp dụng nhiều thay đổi cho cùng một dòng. sed tìm kiếm bất kỳ thứ gì của biểu mẫu "" (regex] *>) và thay thế nó bằng không có gì, vì vậy thẻ html đầu tiên của dòng bị xóa. Nhưng sau đó, trước khi đi đến dòng tiếp theo, nó sẽ kiểm tra xem có cái gì khác bắt đầu bằng "<" không, và nếu có, nó sẽ trở lại nhãn ": bắt đầu" và áp dụng lại điều trị.
Phần kết luận
Bây giờ bạn đã sẵn sàng để nghiên cứu sâu hơn, hoặc chỉ sử dụng nó để sửa đổi đơn giản. Đó là một lệnh mà tôi thấy đặc biệt hữu ích trong các kịch bản nói chung, nhưng nó đã cho tôi một thời gian để hiểu cú pháp của nó. Tôi hy vọng nó sẽ nhanh hơn nhiều cho bạn.
Bạn có biết một lệnh cơ bản khác cho sed? Hay bạn sử dụng một kịch bản nâng cao khác có liên quan đến sed mà bạn muốn chia sẻ? Xin vui lòng cho chúng tôi biết trong các ý kiến.