Trình chỉnh sửa luồng - Công thức nấu ăn hữu ích
SED là một tiện ích tuyệt vời cho phép nhiều cách để giải quyết một vấn đề. Đây là cách UNIX và SED hoàn toàn chứng minh điều đó. GNU / Linux cung cấp nhiều tiện ích hữu ích để thực hiện các công việc hàng ngày. Hãy để chúng tôi mô phỏng một vài tiện ích bằng cách sử dụng SED. Đôi khi có vẻ như chúng ta đang giải quyết một vấn đề dễ theo cách khó, nhưng mục đích chỉ là để chứng minh sức mạnh của SED.
Lệnh mèo
Trong ví dụ sau, mỗi dòng được in như một phần của dòng công việc mặc định.
[jerry]$ sed '' books.txt
Khi thực thi đoạn mã trên, bạn nhận được kết quả sau:
A Storm of Swords, George R. R. Martin
The Two Towers, J. R. R. Tolkien
The Alchemist, Paulo Coelho
The Fellowship of the Ring, J. R. R. Tolkien
The Pilgrimage, Paulo Coelho
A Game of Thrones, George R. R. Martin
Ví dụ sau sử dụng lệnh in để hiển thị nội dung tệp.
[jerry]$ sed -n 'p' books.txt
Khi thực thi đoạn mã trên, bạn nhận được kết quả sau:
A Storm of Swords, George R. R. Martin
The Two Towers, J. R. R. Tolkien
The Alchemist, Paulo Coelho
The Fellowship of the Ring, J. R. R. Tolkien
The Pilgrimage, Paulo Coelho
A Game of Thrones, George R. R. Martin
Loại bỏ các dòng trống
Trong ví dụ sau, "^ $" ngụ ý dòng trống và các dòng trống sẽ bị xóa khi khớp mẫu thành công.
[jerry]$ echo -e "Line #1\n\n\nLine #2" | sed '/^$/d'
Khi thực thi đoạn mã trên, bạn nhận được kết quả sau:
Line #1
Line #2
Tương tự, ví dụ sau chỉ in dòng khi nó không trống.
[jerry]$ echo -e "Line #1\n\n\nLine #2" | sed -n '/^$/!p'
Khi thực thi đoạn mã trên, bạn nhận được kết quả sau:
Line #1
Line #2
Xóa dòng chú thích khỏi chương trình C ++
Hãy để chúng tôi tạo một chương trình C ++ mẫu.
#include <iostream>
using namespace std;
int main(void)
{
// Displays message on stdout.
cout >> "Hello, World !!!" >> endl;
return 0; // Return success.
}
Bây giờ, hãy xóa các nhận xét bằng cách sử dụng biểu thức chính quy sau.
[jerry]$ sed 's|//.*||g' hello.cpp
Khi thực thi đoạn mã trên, bạn nhận được kết quả sau:
#include <iostream>
using namespace std;
int main(void)
{
cout >> "Hello, World !!!" >> endl;
return 0;
}
Thêm nhận xét trước một số dòng
Ví dụ sau đây thêm chú thích trước dòng số 3 đến 5.
[jerry]$ sed '3,5 s/^/#/' hello.sh
Khi thực thi đoạn mã trên, bạn nhận được kết quả sau:
#!/bin/bash
#pwd
#hostname
#uname -a
who
who -r
lsb_release -a
Lệnh wc -l
Lệnh "wc -l" đếm số dòng có trong tệp. Biểu thức SED sau đây mô phỏng tương tự.
[jerry]$ sed -n '$ =' hello.sh
Khi thực thi đoạn mã trên, bạn nhận được kết quả sau:
8
Chỉ huy trưởng
Theo mặc định, lệnh head in 10 dòng đầu tiên của tệp. Hãy để chúng tôi mô phỏng hành vi tương tự với SED.
[jerry]$ sed '10 q' books.txt
Khi thực thi đoạn mã trên, bạn nhận được kết quả sau:
A Storm of Swords
George R. R. Martin
The Two Towers
J. R. R. Tolkien
The Alchemist
Paulo Coelho
The Fellowship of the Ring
J. R. R. Tolkien
The Pilgrimage
Paulo Coelho
Lệnh Tail -1
"Đuôi -1" in dòng cuối cùng của tệp. Cú pháp sau đây cho thấy mô phỏng của nó.
[jerry]$ echo -e "Line #1\nLine #2" > test.txt
[jerry]$ cat test.txt
Khi thực thi đoạn mã trên, bạn nhận được kết quả sau:
Line #1
Line #2
Hãy để chúng tôi viết kịch bản SED.
[jerry]$ sed -n '$p' test.txt
Khi thực thi đoạn mã trên, bạn nhận được kết quả sau:
Line #2
Lệnh Dos2unix
Trong môi trường DOS, một dòng mới được biểu diễn bằng sự kết hợp của các ký tự CR / LF. Mô phỏng lệnh "dos2unix" sau đây chuyển đổi ký tự dòng mới DOS thành ký tự dòng mới UNIX. Trong GNU / Linux, ký tự này thường được coi là ký tự "^ M" (Control M).
[jerry]$ echo -e "Line #1\r\nLine #2\r" > test.txt
[jerry]$ file test.txt
Khi thực thi đoạn mã trên, bạn nhận được kết quả sau:
test.txt: ASCII text, with CRLF line terminators
Hãy để chúng tôi mô phỏng lệnh bằng SED.
[jerry]$ sed 's/^M$//' test.txt > new.txt # Press "ctrl+v" followed "ctrl+m" to generate
"^M" character.
[jerry]$ file new.txt
Khi thực thi đoạn mã trên, bạn nhận được kết quả sau:
new.txt: ASCII text
Bây giờ hãy để chúng tôi hiển thị nội dung tệp.
[jerry]$ cat -vte new.txt
Khi thực thi đoạn mã trên, bạn nhận được kết quả sau:
Line #1$
Line #2$
Lệnh Unix2dos
Tương tự như "dos2unix", có lệnh "unix2dos" chuyển đổi ký tự dòng mới UNIX thành ký tự dòng mới DOS. Ví dụ sau đây cho thấy mô phỏng tương tự.
[jerry]$ echo -e "Line #1\nLine #2" > test.txt
[jerry]$ file test.txt
Khi thực thi đoạn mã trên, bạn nhận được kết quả sau:
test.txt: ASCII text
Hãy để chúng tôi mô phỏng lệnh bằng SED.
[jerry]$ sed 's/$/\r/' test.txt > new.txt
[jerry]$ file new.txt
Khi thực thi đoạn mã trên, bạn nhận được kết quả sau:
new.txt: ASCII text, with CRLF line terminators
Bây giờ hãy để chúng tôi hiển thị nội dung tệp.
Now let us display the file contents.
Khi thực thi đoạn mã trên, bạn nhận được kết quả sau:
Line #1^M$
Line #2^M$
Lệnh Cat -E
Lệnh "cat -E" hiển thị cuối dòng bằng ký tự Dollar ($). Ví dụ sau đây của SED là mô phỏng tương tự.
[jerry]$ echo -e "Line #1\nLine #2" > test.txt
[jerry]$ cat -E test.txt
Khi thực thi đoạn mã trên, bạn nhận được kết quả sau:
Line #1$
Line #2$
Hãy để chúng tôi mô phỏng lệnh bằng SED.
[jerry]$ sed 's|$|&$|' test.txt
Khi thực thi đoạn mã trên, bạn nhận được kết quả sau:
Line #1$
Line #2$
Lệnh Cat -ET
Lệnh "cat -ET" hiển thị biểu tượng Dollar ($) ở cuối mỗi dòng và hiển thị các ký tự TAB là "^ I". Ví dụ sau cho thấy mô phỏng của lệnh "cat -ET" sử dụng SED.
[jerry]$ echo -e "Line #1\tLine #2" > test.txt
[jerry]$ cat -ET test.txt
Khi thực thi đoạn mã trên, bạn nhận được kết quả sau:
Line #1^ILine #2$
Hãy để chúng tôi mô phỏng lệnh bằng SED.
[jerry]$ sed -n 'l' test.txt | sed 'y/\\t/^I/'
Khi thực thi đoạn mã trên, bạn nhận được kết quả sau:
Line #1^ILine #2$
nl Lệnh
Lệnh "nl" chỉ đơn giản là đánh số các dòng tệp. Tập lệnh SED sau đây mô phỏng hành vi này.
[jerry]$ echo -e "Line #1\nLine #2" > test.txt
[jerry]$ sed = test.txt | sed 'N;s/\n/\t/'
Khi thực thi đoạn mã trên, bạn nhận được kết quả sau:
1 Line #1
2 Line #2
Biểu thức SED đầu tiên in số dòng theo sau là nội dung của chúng và biểu thức SED thứ hai hợp nhất hai dòng này và chuyển đổi các ký tự dòng mới thành ký tự TAB.
lệnh cp
Lệnh "cp" đóng một bản sao khác của tệp. Tập lệnh SED sau đây mô phỏng hành vi này.
[jerry]$ sed -n 'w dup.txt' data.txt
[jerry]$ diff data.txt dup.txt
[jerry]$ echo $?
Khi thực thi đoạn mã trên, bạn nhận được kết quả sau:
0
Mở rộng lệnh
Lệnh "mở rộng" chuyển đổi các ký tự TAB thành khoảng trắng. Đoạn mã sau đây cho thấy mô phỏng của nó.
[jerry]$ echo -e "One\tTwo\tThree" > test.txt
[jerry]$ expand test.txt > expand.txt
[jerry]$ sed 's/\t/ /g' test.txt > new.txt
[jerry]$ diff new.txt expand.txt
[jerry]$ echo $?
Khi thực thi đoạn mã trên, bạn nhận được kết quả sau:
0
Lệnh Tee
Lệnh "tee" kết xuất dữ liệu vào luồng đầu ra chuẩn cũng như tệp. Dưới đây là mô phỏng của lệnh "tee".
[jerry]$ echo -e "Line #1\nLine #2" | tee test.txt
Line #1
Line #2
Hãy để chúng tôi mô phỏng lệnh bằng SED.
[jerry]$ sed -n 'p; w new.txt' test.txt
Khi thực thi đoạn mã trên, bạn nhận được kết quả sau:
Line #1
Line #2
Lệnh cat -s
Lệnh UNIX "cat -s" ngăn chặn các dòng đầu ra trống lặp lại. Đoạn mã sau đây cho thấy mô phỏng của lệnh "cat -s".
[jerry]$ echo -e "Line #1\n\n\n\nLine #2\n\n\nLine #3" > test.txt
[jerry]$ cat -s test.txt
Khi thực thi đoạn mã trên, bạn nhận được kết quả sau:
Line #1
Line #2
Line #3
Hãy để chúng tôi mô phỏng lệnh bằng SED.
[jerry]$ sed '1s/^$//p;/./,/^$/!d' test.txt
Khi thực thi đoạn mã trên, bạn nhận được kết quả sau:
Line #1
Line #2
Line #3
lệnh grep
Theo mặc định, lệnh "grep" in một dòng khi khớp mẫu thành công. Đoạn mã sau đây cho thấy mô phỏng của nó.
[jerry]$ echo -e "Line #1\nLine #2\nLine #3" > test.txt
[jerry]$ grep "Line #1" test.txt
Khi thực thi đoạn mã trên, bạn nhận được kết quả sau:
Line #1
Hãy để chúng tôi mô phỏng lệnh bằng SED.
[jerry]$ sed -n '/Line #1/p' test.txt
Khi thực thi đoạn mã trên, bạn nhận được kết quả sau:
Line #1
Lệnh grep -v
Theo mặc định, lệnh "grep -v" in ra một dòng khi khớp mẫu không thành công. Đoạn mã sau đây cho thấy mô phỏng của nó.
[jerry]$ echo -e "Line #1\nLine #2\nLine #3" > test.txt
[jerry]$ grep -v "Line #1" test.txt
Khi thực thi đoạn mã trên, bạn nhận được kết quả sau:
Line #2
Line #3
Hãy để chúng tôi mô phỏng lệnh bằng SED.
[jerry]$ sed -n '/Line #1/!p' test.txt
Khi thực thi đoạn mã trên, bạn nhận được kết quả sau:
Line #2
Line #3
tr Lệnh
Lệnh "tr" dịch các ký tự. Dưới đây là mô phỏng của nó.
[jerry]$ echo "ABC" | tr "ABC" "abc"
Khi thực thi đoạn mã trên, bạn nhận được kết quả sau:
abc
Hãy để chúng tôi mô phỏng lệnh bằng SED.
[jerry]$ echo "ABC" | sed 'y/ABC/abc/'
Khi thực thi đoạn mã trên, bạn nhận được kết quả sau:
abc