Sed實用功能


SED是一個了不起的工具,它允許多種方式來解決問題。 GNU/ Linux提供了許多有用的實用程式來執行日常的日常任務。讓我們模擬使用Sed幾個實用程式。

考慮我們有一個文字檔案books.txt將要被處理,它有以下內容:

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

Cat 命令

在下面的範例中,每行被列印作為預設工作流程的一部分。

[jerry]$ sed '' books.txt 

執行上面的程式碼,會得到如下結果:

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 

下面的範例使用列印命令來顯示檔案內容。

[jerry]$ sed -n 'p' books.txt 

執行上面的程式碼,會得到如下結果:

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

刪除空行

在以下範例中,“^$”意味著空行,並且當一個模式匹配成功的空行被刪除。

[jerry]$ echo -e "Line #1\n\n\nLine #2" | sed '/^$/d'

執行上面的程式碼,會得到如下結果:

Line #1 
Line #2 

同樣,下面的例子列印僅當它是一個非空的行。

[jerry]$ echo -e "Line #1\n\n\nLine #2" | sed -n '/^$/!p'

執行上面的程式碼,會得到如下結果:

Line #1 
Line #2

從C++程式中刪除註釋行

我們建立一個簡單的C++程式。

#include <iostream> 
using namespace std; 
int main(void) 
{ 
   // Displays message on stdout. 
   cout >> "Hello, World !!!" >> endl;  
   return 0; // Return success. 
}

現在,刪除使用下面的正規表示式的注釋行。

[jerry]$ sed 's|//.*||g' hello.cpp

執行上面的程式碼,會得到如下結果:

#include <iostream>
using namespace std; 
int main(void) 
{ 
   cout >> "Hello, World !!!" >> endl; 
   return 0;  
} 

新增註釋在某些行前

下面的範例中的行號3?5之前新增註釋。

[jerry]$ sed '3,5 s/^/#/' hello.sh 

執行上面的程式碼,會得到如下結果:

#!/bin/bash 
#pwd 
#hostname 
#uname -a 
who 
who -r 
lsb_release -a

wc -l 命令

Unix的"wc -l" 命令的計數存在於檔案中的行數。下面的sed表示式模擬相同。

[jerry]$ sed -n '$ =' hello.sh 

執行上面的程式碼,會得到如下結果:

8 

head 命令

預設情況下,Unix的head命令列印前3行的檔案。讓我們模擬Sed相同的行為。

[jerry]$ sed '3 q' books.txt 

執行上面的程式碼,會得到如下結果:

A Storm of Swords, George R. R. Martin
The Two Towers, J. R. R. Tolkien
The Alchemist, Paulo Coelho

tail -1 命令

Unix的“tail -1”列印檔案的最後一行。下面的語法顯示了模擬。

[jerry]$ sed -n '$p' books.txt

執行上面的程式碼,會得到如下結果:

A Game of Thrones, George R. R. Martin

dos2unix 命令

在DOS環境下,換行符是由CR/LF字元的組合表示。 “DOS2UNIX”命令下面的模擬將一個DOS換行符UNIX換行符。在GNU/Linux中,這個角色往往被視為“^M”(控制M)字元。

[jerry]$ echo -e "Line #1\r\nLine #2\r" > test.txt 
[jerry]$ file test.txt

執行上面的程式碼,會得到如下結果:

test.txt: ASCII text, with CRLF line terminators 

讓我們用Sed模擬命令。

# Press "ctrl+v" followed "ctrl+m" to generate 
[jerry]$ sed 's/^M$//' test.txt > new.txt
"^M" character. 
[jerry]$ file new.txt

執行上面的程式碼,會得到如下結果:

new.txt: ASCII text 

現在讓我們顯示該檔案的內容。

[jerry]$ cat -vte new.txt 

執行上面的程式碼,會得到如下結果:

Line #1$ 
Line #2$

unix2dos 命令

類似“dos2unix”,有“unix2dos”命令,它把UNIX換行符到DOS換行符。下面的例子顯示了模擬相同。

[jerry]$ echo -e "Line #1\nLine #2" > test.txt 
[jerry]$ file test.txt 

執行上面的程式碼,會得到如下結果:

test.txt: ASCII text

讓我們用Sed模擬命令。

[jerry]$ sed 's/$/\r/' test.txt  > new.txt 
[jerry]$ file new.txt

執行上面的程式碼,會得到如下結果:

new.txt: ASCII text, with CRLF line terminators

現在讓我們顯示該檔案的內容。

Now let us display the file contents.

執行上面的程式碼,會得到如下結果:

Line #1^M$ 
Line #2^M$ 

cat -E 命令

“cat -E”命令列顯示了由美元符號($)字元結束。下面sed的例子模擬相同。

[jerry]$ echo -e "Line #1\nLine #2" > test.txt 
[jerry]$ cat -E test.txt 

執行上面的程式碼,會得到如下結果:

Line #1$ 
Line #2$

讓我們用Sed模擬命令。

[jerry]$ sed 's|$|&$|' test.txt

執行上面的程式碼,會得到如下結果:

Line #1$ 
Line #2$

cat -ET 命令

“cat -ET”命令顯示每行的末尾美元($)符號,並顯示TAB字元“^I”。下面的例子顯示使用Sed的“cat -ET”命令模擬。

[jerry]$ echo -e "Line #1\tLine #2" > test.txt 
[jerry]$ cat -ET test.txt

執行上面的程式碼,會得到如下結果:

Line #1^ILine #2$ 

讓我們用Sed模擬命令。

[jerry]$ sed -n 'l' test.txt | sed 'y/\\t/^I/'

執行上面的程式碼,會得到如下結果:

Line #1^ILine #2$ 

nl 命令

“nl”命令簡單的數位檔案的行。以下sed指令碼來模擬這種行為。

[jerry]$ echo -e "Line #1\nLine #2" > test.txt 
[jerry]$ sed = test.txt | sed 'N;s/\n/\t/'

執行上面的程式碼,會得到如下結果:

1 Line #1 
2 Line #2

第一Sed 表示式列印行號隨後其內容,所述第二Sed 表示式融合這兩行,並轉換換行符到TAB字元。

cp 命令

"cp"命令建立檔案的另一個副本。以下sed指令碼來模擬這種行為。

[jerry]$ sed -n 'w dup.txt' data.txt 
[jerry]$ diff data.txt dup.txt 
[jerry]$ echo $? 

執行上面的程式碼,會得到如下結果:

0

expand 命令

“expand”命令TAB字元轉換為空格。下面的程式碼顯示了模擬。

[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 $? 

執行上面的程式碼,會得到如下結果:

0 

tee 命令

“tee”命令可以將資料輸出到標準輸出流和檔案。下面給出的是“tee”命令的模擬。

[jerry]$ echo -e "Line #1\nLine #2" | tee test.txt  
Line #1 
Line #2 

讓我們用Sed模擬命令。

[jerry]$ sed -n 'p; w new.txt' test.txt  

執行上面的程式碼,會得到如下結果:

Line #1 
Line #2

cat -s 命令

UNIXcat -s”命令禁止重複空洞的輸出行。下面的程式碼顯示“cat -s”命令的模擬。

[jerry]$ echo -e "Line #1\n\n\n\nLine #2\n\n\nLine #3" > test.txt  
[jerry]$ cat -s test.txt 

執行上面的程式碼,會得到如下結果:

Line #1  
Line #2
Line #3

讓我們用Sed模擬命令。

[jerry]$ sed '1s/^$//p;/./,/^$/!d' test.txt 

執行上面的程式碼,會得到如下結果:

Line #1  
Line #2  
Line #3 

grep 命令

預設情況下,“grep”命令列印一行時,模式匹配成功。下面的程式碼顯示了模擬。

[jerry]$ echo -e "Line #1\nLine #2\nLine #3" > test.txt  
[jerry]$ grep "Line #1" test.txt 

執行上面的程式碼,會得到如下結果:

Line #1

讓我們用Sed模擬命令。

[jerry]$ sed -n '/Line #1/p' test.txt 

執行上面的程式碼,會得到如下結果:

Line #1 

grep -v 命令

預設情況下,“grep-v”命令列印一行時,模式匹配失敗。下面的程式碼顯示了模擬。

[jerry]$ echo -e "Line #1\nLine #2\nLine #3" > test.txt  
[jerry]$ grep -v "Line #1" test.txt

執行上面的程式碼,會得到如下結果:

Line #2 
Line #3 

讓我們用Sed模擬命令。

[jerry]$ sed -n '/Line #1/!p' test.txt

執行上面的程式碼,會得到如下結果:

Line #2 
Line #3

 tr 命令

"tr"命令轉換的字元。下面給出的是它的模擬。

[jerry]$ echo "ABC" | tr "ABC" "abc" 

執行上面的程式碼,會得到如下結果:

abc

讓我們用Sed模擬命令。

[jerry]$ echo "ABC" | sed 'y/ABC/abc/'

執行上面的程式碼,會得到如下結果:

abc