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