Thứ Năm, 30 tháng 10, 2014

[CLI] Sed - a stream editor.

Bài viết thực hiện trên:
thanhnt@Thanhnt:~$ lsb_release -r
Release:    12.04
Sed là gì?
NAME
       sed - stream editor for filtering and transforming text
Sed là viết tắt của stream editor.
Như bạn đã thấy, sed là một stream editor, một editor đặc biệt, có thể tìm kiếm và thay đổi một file một cách linh hoạt.

Một số câu lệnh với sed.


1. The essential command: s for substitutionCâu lệnh s sẽ thay thế tất cả các giá trị phù hợp thành một giá trị mới.
Ví dụ, để chuyển 'day'  trong file "old" thành 'night' và ghi vào một file mới "new".
sed s/day/night/ <old >new
 Hoặc theo một cách khác:
sed s/day/night/ old >new
Một ví dụ:
thanhnt@Thanhnt:~$ echo sunday | sed s/day/night/
sunnight
Chú ý: bạn không cần đặt " " vào 'day' hay 'night' vì chúng không cần thiết.
Tuy nhiên, bạn được khuyên nên  đặt ' ' vào câu lệnh như sau:
thanhnt@Thanhnt:~$ echo sunday | sed 's/day/night/'
sunday
Điều này sẽ hữu ích khi trong câu lệnh của bạn có các metadata characters.
Nếu trong câu lệnh có các kí tự đặc biệt, bạn cần đặt trước chúng kí tự sau: '\'

Từ các ví dụ trên, chúng ta có thể rút ra được syntax của câu lệnh như sau:
sed 's/pattern/replace/' filename

2.The slash as a delimiter

Nếu bạn muốn chuyển /usr/local/bin thành /common/bin, bạn sẽ không thể dùng:
sed '/ /usr/local/bin / /common/bin/
theo đúng syntax do '/' là kí tự đặc biệt. Khi đó bạn cần đặt '\' trước mỗi '/' như sau:
sed '/ \/usr\/local\/bin / \/common\/bin/
hoặc sử dụng '|':
sed '|/usr/local/bin |/common/bin|

3. Using & as the matched string

Đôi khi bạn muốn lặp lại một số lần pattern, khi ấy bạn có thể dùng '&' thay thế cho matched string.
Ví dụ:
thanhnt@Thanhnt:~$ echo "123 và 456" | sed 's/123/&&/'
123123 và 456
thanhnt@Thanhnt:~$ echo "123 và 456" | sed 's/123/& &/'
123 123 và 456
thanhnt@Thanhnt:~$ echo "123 và 456" | sed 's/123/&, &/'
123, 123 và 456
thanhnt@Thanhnt:~$ echo "123 và 456" | sed 's/[0-9]*/&, &/'
123, 123 và 456


Chú ý: sed không suppot cho kí tự '+'. Để thực hiện pattern với '+', bạn cần thêm option -r:
thanhnt@Thanhnt:~$ echo "123 và 456" | sed 's/[0-9]+/&, &/'
123 và 456
thanhnt@Thanhnt:~$ echo "123 và 456" | sed -r 's/[0-9]+/&, &/'
123, 123 và 456
4. Một số câu lệnh hữu ích khác:
4.1. Xóa tất cả các dòng trắng trong một file:
$ sed '/^$/d' filename > output.txt
4.2. Xóa tất cả những dòng bắt đầu với một kí tự xác định. Ví dụ dấu # (trường hợp này rất hữu ích khi làm gọn các file config :)) )
$ sed 's/#.*//' filename > output.txt

Sed còn rất nhiều các trường hợp khác, khi nào cần dùng thì tìm hiểu tiếp :D
Tham khảo thêm tại:

http://www.grymoire.com/Unix/Sed.html#uh-0


Không có nhận xét nào:

Đăng nhận xét