Tìm hiểu Sed cơ bản

1. Giới thiệu

Đối với những hệ điều hành nhân Linux, sed stream editor thường được trang bị đi kèm. Đây là một trình biên soạn văn bản thực hiện những thao tác chỉnh sửa đối với dữ liệu đến từ một đầu vào chuẩn hoặc một file text. sed sẽ tiến hành chỉnh sửa lần lượt từng dòng và theo cách thức không tương tác. Điều này có thể hơi khó hiểu và thiếu trực quan ban đầu nhưng lại là một cách hiệu quả và nhanh chóng để chuyển đổi dữ liệu văn bản.

Trong bài này, chúng ta sẽ cùng tìm hiểu một vài thao tác cơ bản khi làm việc với sed. Bạn gần như sẽ không thay thế trình biên soạn văn bản thường dùng bằng sed, nhưng nó có thể trở thành một phần bổ sung vào hộp đồ nghề của mỗi lập trình viên khi làm việc với những file code.

2. Cách sử dụng cơ bản

Thông thường, sed hoạt động trên một luồng dữ liệu được đọc từ đầu vào chuẩn hoặc một file văn bản. Mặc định, sed sẽ hiển thị kết quả ra màn hình, trừ khi có sự chuyển hướng kết quả này, ví dụ như in kết quả ra một file.

Cú pháp cơ bản của lệnh sed:

sed [option] commands [file-to-edit]

Chúng ta sẽ sao chép file text có sẵn trong máy tính đến thư mục home để thực hành việc chỉnh sửa với sed:

cd
cp /usr/share/common-licenses/BSD .

Trước hết, có thể sử dụng sed để xem nội dung file:

sed '' BSD
Copyright (c) The Regents of the University of California.
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
   notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
   notice, this list of conditions and the following disclaimer in the
...
...

Cặp nháy đơn sẽ chứa những câu lệnh dùng để chỉnh sửa đoạn văn bản mà chúng ta truyền vào sed. Trong ví dụ trên, chúng ta không truyền lệnh gì cả, do đó mặc định sed sẽ in ra màn hình mỗi dòng nó nhận được từ đầu vào.

3. In kết quả ra màn hình

Thay vì để sed in kết quả ra màn hình mặc định như ví dụ trước, bây giờ chúng ta sẽ sử dụng lệnh print để thực hiện hành động này một cách tường minh, bằng cách truyền vào ký tự p ở trong cặp nháy đơn:

sed 'p' BSD
Copyright (c) The Regents of the University of California.
Copyright (c) The Regents of the University of California.
All rights reserved.
All rights reserved.


Redistribution and use in source and binary forms, with or without
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
modification, are permitted provided that the following conditions
are met:
are met:
1. Redistributions of source code must retain the above copyright
1. Redistributions of source code must retain the above copyright
...
...

Ở đây, sed đã in ra mỗi dòng 2 lần, bởi vì theo mặc định nó sẽ tự động in ra mỗi dòng, sau đó với tham số p, chúng ta lại chỉ định sed in ra tường minh một lần nữa mỗi dòng văn bản đầu vào. Để hủy bỏ việc tự động in kết quả của sed, bạn có thể dụng tùy chọn -n:

sed -n 'p' BSD
Copyright (c) The Regents of the University of California.
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
   notice, this list of conditions and the following disclaimer.
...
...

Kết quả là, chúng ta đã in ra mỗi dòng chỉ 1 lần.

Để có thể linh hoạt hơn trong việc in kết quả ra màn hình, ví dụ như chỉ in ra dòng đầu tiên, in ra các dòng từ 1 - 5, hoặc in ra các dòng có thứ tự lẻ... thì chúng ta cần sử dụng thêm các tham số kết hợp với lệnh p.

Chỉ in ra dòng đầu tiên:

sed -n '1p' BSD
Copyright (c) The Regents of the University of California.

In ra các dòng từ 1 - 5:

sed -n '1,5p' BSD
Copyright (c) The Regents of the University of California.
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions

In ra các dòng với số thứ tự lẻ:

sed -n '1~2p' BSD
Copyright (c) The Regents of the University of California.

modification, are permitted provided that the following conditions
1. Redistributions of source code must retain the above copyright
2. Redistributions in binary form must reproduce the above copyright
   documentation and/or other materials provided with the distribution.
...
...

Tương tự như trên, cú pháp để in ra các dòng với số thứ tự chẵn sẽ như sau:

sed -n '2~2p' BSD

4. Thay thế

Thay thế text là một trong những chức năng phổ biến và hữu ích nhất của sed. Nó có khả năng tìm kiếm văn bản dựa trên xâu ký tự hoặc biểu thức chính quy, sau đó thực hiện hành động thay thế.

Ở dạng đơn giản nhất, bạn có thể thay thế một từ bằng từ khác thông qua cú pháp sau:

's/old_word/new_word'

Ký tự s là viết tắt của từ substitute, có nghĩ là thay thế văn bản. Ba dấu xược / được sử dụng để ngăn cách những trường văn bản khác nhau. Chúng ta có thể sử dụng những ký tự khác với vai trò tương tự trong trường hợp để tránh sự nhầm lẫn. Dưới đây là một ví dụ đơn giản của việc thay thế văn bản khi làm việc với sed:

echo "http://www.example.com/index.html" | sed 's_com/index_org/home_'
http://www.example.org/home.html

5. Kết luận

Chúng ta vừa điểm qua một số vấn đề cơ bản khi làm việc với sed. Bạn có thể thấy trình biên soạn này hỗ trợ chúng ta chỉnh sửa text một cách nhanh chóng và hiển thị kết quả ngay tại màn hình terminal. Tìm hiểu sed ở những mức độ chi tiết, cụ thể hơn, chúng ta sẽ khám phá ra nhiều cách sử dụng hữu ích, đa dạng hơn nữa của công cụ này. Hẹn gặp lại các bạn ở những bài viết sau.

6. Tài liệu tham khảo