Sed, như cái tên của nó Stream EDitor, dùng để thao tác trực tiếp với văn bản như thay thế, xóa dòng, in ra một số dòng v.v.. Để bắt đầu sẽ xem qua một ví dụ:
$ echo day | sed s/day/night/ # Thay thế day bằng night
$ echo "day Thursday" | sed 's/day/night/g' # thêm "g" để thay thế tất cả day bằng night
$ echo "day Thursday" | sed 's/day/night/g' # thêm "g" để thay thế tất cả day bằng night
Cú pháp của lệnh:
sed [tùy chọn]... {script-only-if-no-other-script} [input-file]...
Các toán tử cơ bản của sed:
[địa_chỉ_vùng]/p : In ra [vùng đã chỉ ra]. "p" là viết tắt của print.
[địa_chỉ_vùng]/d : Xóa [vùng đã chỉ ra]. "d" là viết tắt của delete.
s/mẫu1/mẫu2/ : Thay thế mẫu2 bằng mẫu1 đầu tiên của một dòng. "s" là viết tắt của substitute.
[địa_chỉ_vùng]/s/mẫu1/mẫu2/ : Giống như trên nhưng chỉ áp dụng cho vùng đã chọn
[địa_chỉ_vùng]/y/mẫu1/mẫu2/ : thay thế các ký tự trong mẫu1 với từng ký tự tương ứng tron mẫu2, áp dụng cho vùng đã chọn (tương đương với lệnh tr).
g : Thao tác trên toàn bộ dòng. "g" ở đây là viết tắt của global.
[địa_chỉ_vùng]/d : Xóa [vùng đã chỉ ra]. "d" là viết tắt của delete.
s/mẫu1/mẫu2/ : Thay thế mẫu2 bằng mẫu1 đầu tiên của một dòng. "s" là viết tắt của substitute.
[địa_chỉ_vùng]/s/mẫu1/mẫu2/ : Giống như trên nhưng chỉ áp dụng cho vùng đã chọn
[địa_chỉ_vùng]/y/mẫu1/mẫu2/ : thay thế các ký tự trong mẫu1 với từng ký tự tương ứng tron mẫu2, áp dụng cho vùng đã chọn (tương đương với lệnh tr).
g : Thao tác trên toàn bộ dòng. "g" ở đây là viết tắt của global.
Một số ví dụ về thao tác với sed
10d Xóa dòng thứ mười.
/^$/d Xóa các dòng trống.
1,/^$/d Xóa từ dòng đầu tiên cho đến khi gặp dòng trống đầu tiên.
/NAM/p Chỉ in ra dòng chứa "NAM" (phải dùng cùng với tùy chọn -n).
s/ *$// Xóa tất cả các khoảng trắng ở cuối mỗi dòng.
/NAM/d Xóa tất cả cách dòng chứa "NAM".
s/NAM//g Chỉ thay thế chữ "NAM", các phần còn lại giữ nguyên.
/^$/d Xóa các dòng trống.
1,/^$/d Xóa từ dòng đầu tiên cho đến khi gặp dòng trống đầu tiên.
/NAM/p Chỉ in ra dòng chứa "NAM" (phải dùng cùng với tùy chọn -n).
s/ *$// Xóa tất cả các khoảng trắng ở cuối mỗi dòng.
/NAM/d Xóa tất cả cách dòng chứa "NAM".
s/NAM//g Chỉ thay thế chữ "NAM", các phần còn lại giữ nguyên.
sed 's/\/usr\/local\/bin/\/common\/bin/' # theo mặc định
sed -i 's_/usr/local/bin_/common/bin_' # dấu _ (cần tùy chọn -i )
sed -i 's:/usr/local/bin:/common/bin:' # dấu :
sed -i 's|/usr/local/bin|/common/bin|' # dấu |
Lệnh nâng cao của sed: $ echo "123 abc" | sed 's/[0-9]*/& &/'
Việc thay thế dấu xuống dòng trực tiếp bằng toán tử s/ là không khả thi. Để thay thế dấu xuống dòng hãy làm theo cách dưới đây:
$ tr -d '\n' < file # use tr to delete newlines
$ sed ':a;N;$!ba;s/\n//g' file # GNU sed to delete newlines
$ sed 's/$/ foo/' file # add "foo" to end of each line
$ sed ':a;N;$!ba;s/\n//g' file # GNU sed to delete newlines
$ sed 's/$/ foo/' file # add "foo" to end of each line
0 nhận xét:
Đăng nhận xét