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
在下面的範例中,每行被列印作為預設工作流程的一部分。
[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++程式。
#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
Unix的"wc -l" 命令的計數存在於檔案中的行數。下面的sed表示式模擬相同。
[jerry]$ sed -n '$ =' hello.sh
執行上面的程式碼,會得到如下結果:
8
預設情況下,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
Unix的“tail -1”列印檔案的最後一行。下面的語法顯示了模擬。
[jerry]$ sed -n '$p' books.txt
執行上面的程式碼,會得到如下結果:
A Game of Thrones, George R. R. Martin
在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$
類似“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”命令列顯示了由美元符號($)字元結束。下面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”命令顯示每行的末尾美元($)符號,並顯示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”命令簡單的數位檔案的行。以下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"命令建立檔案的另一個副本。以下sed指令碼來模擬這種行為。
[jerry]$ sed -n 'w dup.txt' data.txt [jerry]$ diff data.txt dup.txt [jerry]$ echo $?
執行上面的程式碼,會得到如下結果:
0
“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”命令的模擬。
[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
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”命令列印一行時,模式匹配成功。下面的程式碼顯示了模擬。
[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”命令列印一行時,模式匹配失敗。下面的程式碼顯示了模擬。
[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"命令轉換的字元。下面給出的是它的模擬。
[jerry]$ echo "ABC" | tr "ABC" "abc"
執行上面的程式碼,會得到如下結果:
abc
讓我們用Sed模擬命令。
[jerry]$ echo "ABC" | sed 'y/ABC/abc/'
執行上面的程式碼,會得到如下結果:
abc