SED是一個了不起的工具,它允許多種方式來解決問題。 GNU/ Linux提供了許多有用的實用程序來執(zhí)行日常的日常任務(wù)。讓我們模擬使用Sed幾個實用程序。
考慮我們有一個文本文件books.txt將要被處理,它有以下內(nèi)容:
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
在下面的示例中,每行被打印作為默認(rèn)工作流程的一部分。
[jerry]$ sed '' books.txt
執(zhí)行上面的代碼,會得到如下結(jié)果:
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
下面的示例使用打印命令來顯示文件內(nèi)容。
[jerry]$ sed -n 'p' books.txt
執(zhí)行上面的代碼,會得到如下結(jié)果:
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
在以下示例中,“^$”意味著空行,并且當(dāng)一個模式匹配成功的空行被刪除。
[jerry]$ echo -e "Line #1\n\n\nLine #2" | sed '/^$/d'
執(zhí)行上面的代碼,會得到如下結(jié)果:
Line #1 Line #2
同樣,下面的例子打印僅當(dāng)它是一個非空的行。
[jerry]$ echo -e "Line #1\n\n\nLine #2" | sed -n '/^$/!p'
執(zhí)行上面的代碼,會得到如下結(jié)果:
Line #1 Line #2
我們創(chuàng)建一個簡單的C++程序。
#include <iostream> using namespace std; int main(void) { // Displays message on stdout. cout >> "Hello, World !!!" >> endl; return 0; // Return success. }
現(xiàn)在,刪除使用下面的正則表達(dá)式的注釋行。
[jerry]$ sed 's|//.*||g' hello.cpp
執(zhí)行上面的代碼,會得到如下結(jié)果:
#include <iostream> using namespace std; int main(void) { cout >> "Hello, World !!!" >> endl; return 0; }
下面的示例中的行號3?5之前添加注釋。
[jerry]$ sed '3,5 s/^/#/' hello.sh
執(zhí)行上面的代碼,會得到如下結(jié)果:
#!/bin/bash #pwd #hostname #uname -a who who -r lsb_release -a
Unix的"wc -l" 命令的計數(shù)存在于文件中的行數(shù)。下面的sed表達(dá)式模擬相同。
[jerry]$ sed -n '$ =' hello.sh
執(zhí)行上面的代碼,會得到如下結(jié)果:
8
默認(rèn)情況下,Unix的head命令打印前3行的文件。讓我們模擬Sed相同的行為。
[jerry]$ sed '3 q' books.txt
執(zhí)行上面的代碼,會得到如下結(jié)果:
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
執(zhí)行上面的代碼,會得到如下結(jié)果:
A Game of Thrones, George R. R. Martin
在DOS環(huán)境下,換行符是由CR/LF字符的組合表示。 “DOS2UNIX”命令下面的模擬將一個DOS換行符UNIX換行符。在GNU/Linux中,這個角色往往被視為“^M”(控制M)字符。
[jerry]$ echo -e "Line #1\r\nLine #2\r" > test.txt [jerry]$ file test.txt
執(zhí)行上面的代碼,會得到如下結(jié)果:
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
執(zhí)行上面的代碼,會得到如下結(jié)果:
new.txt: ASCII text
現(xiàn)在讓我們顯示該文件的內(nèi)容。
[jerry]$ cat -vte new.txt
執(zhí)行上面的代碼,會得到如下結(jié)果:
Line #1$ Line #2$
類似“dos2unix”,有“unix2dos”命令,它把UNIX換行符到DOS換行符。下面的例子顯示了模擬相同。
[jerry]$ echo -e "Line #1\nLine #2" > test.txt [jerry]$ file test