Sed教程(五):管理模式、正则表达式、使用功能
我們已經討論了使用模式和保持緩沖區。現在我們就來探討更多關于它們使用的例子。
n 命令
n命令打印出模式緩沖區的內容,清除模式緩沖器,讀取下一行到模式緩沖區,并在其上施加命令。下面給出的是 n命令的語法。
[address1[,address2]]n下面是一個使用它打印指定的文件的內容n命令一個簡單的例子:
[jerry]$ sed 'n' books.txt當執行上面的代碼,它會列出下來的文件 books.text 內容:
1) A Storm of Swords, George R. R. Martin, 1216 2) The Two Towers, J. R. R. Tolkien, 352 3) The Alchemist, Paulo Coelho, 197 4) The Fellowship of the Ring, J. R. R. Tolkien, 432 5) The Pilgrimage, Paulo Coelho, 288 6) A Game of Thrones, George R. R. Martin, 864讓我們考慮有n個前3個 sed命令和正經過兩個sed命令如下:
Sed command #1 Sed command #2 Sed command #3 n command Sed command #4 Sed command #5這里,Sed應用于前三個命令對模式緩沖存儲器,清除模式緩沖器,讀取下一行到模式緩沖區,然后添加在第四和第五指令就可以了。
保持緩沖器保存的數據,但用sed命令不能在保持緩沖器直接應用。因此,我們需要使保持緩沖器數據轉換成模式緩沖區。Sed提供了x 命令模式和保持緩沖區的內容。下面的命令說明x命令。
讓我們稍微修 改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 'x;n;p' books.txt在執行上面的代碼,會得到如下結果:
George R. R. Martin J. R. R. Tolkien Paulo Coelho J. R. R. Tolkien Paulo Coelho George R. R. Martin讓我們來了解此命令的工作原理。
-
最初,Sed讀取第一行,即A Storm of Swords入模式緩沖區中。
-
x?命令移動該行保持緩沖區。
-
n?讀取下一行,即,George R. R. Martin到模式緩沖區。
-
將控制傳遞到該命令后跟n打印出模式緩沖區的內容。
-
這個過程一直重復,直到文件被讀完。
現在讓我們印刷,這將導致印刷書籍的標題前交換緩沖區的內容。
[jerry]$ sed -n 'x;n;x;p' books.txt執行上面的代碼,得到如下結果:
A Storm of Swords The Two Towers The Alchemist The Fellowship of the Ring The Pilgrimage A Game of Thronesh 命令
h命令處理保持緩沖區。從模式緩沖區,以保持它的緩沖區拷貝數據。從保持現有的緩存數據被覆蓋。需要注意的是-h命令不動的數據,它只是復制數據。因此,復制的數據保持,因為它是在模式緩沖區。下面給出的是-h命令的語法。
[address1[,address2]]h下面的命令打印標題-作家Paulo Coelho。
[jerry]$ sed -n '/Paulo/!h; /Paulo/{x;p}' books.txt執行上面的代碼,得到如下結果:
The Alchemist The PilgrimageH 命令
h命令破壞了保持緩沖器以前的內容。這并不總是可以接受的,因為有時我們需要保留的內容。為了這個目的,sed提供了通過添加一個新行,在所述端部追加的內容,以保持緩沖器為H命令。 h和H的命令之間的唯一差別是,保持緩沖器前者重寫數據,而后來的數據追加到保持緩沖器。它的語法類似于這是如下的h命令:
[address1[,address2]]H讓我們再舉一個例子。而不是僅打印書名這一次,打印其作者的名字了。下面的例子打印書名后面的作者姓名。
[jerry]$ sed -n '/Paulo/!h; /Paulo/{H;x;p}' books.txt執行上面的代碼,得到如下結果:
The Alchemist Paulo Coelho The Pilgrimage Paulo Coelhog 命令
我們學會了如何復制/追加模式緩沖區中的內容保存緩沖區。我們可以執行相反的功能呢?肯定是的!為了這個目的,Sed提供 g 命令其副本從保持緩沖器到模式緩沖區中的數據。而復制,從模式空間現有的數據被覆蓋。下面給出了g命令的語法。
[address1[,address2]]g讓我們考慮相同的例子- 在打印的書名和作者。這一次,我們將首先打印的作者和下一行,相應的題書的名字。下面的命令打印的作者Paulo Coelho,其次是它的書名的名字。
[jerry]$ sed -n '/Paulo/!h; /Paulo/{p;g;p}' books.txt執行上面的代碼,會得到如下結果:
Paulo Coelho The Alchemist Paulo Coelho The PilgrimageG 命令
同樣,我們可以追加保持緩沖器中的內容到模式緩沖區。Sed提供G指令它通過添加一個新行,在末尾追加內容到圖案緩沖區。它的語法是類似于g命令是如下:
[address1[,address2]]G現在,就讓我們來它打印的作者Paulo Coelho隨后其書名名稱前面的例子。為了達到同樣的效果,請執行以下sed命令。
[jerry]$ sed -n '/Paulo/!h; /Paulo/{G;p}' books.txt執行上面的代碼,會得到如下結果:
Paulo Coelho The Alchemist Paulo Coelho The Pilgrimage可以修改上面的例子中,只需更換G指令之前,緩沖區的內容如下顯示書名后面他們的作者:
[jerry]$ sed -n '/Paulo/!h; /Paulo/{x;G;p}' books.txt執行上面的代碼,會得到如下結果:
The Alchemist Paulo Coelho The Pilgrimage Paulo Coelho
sed是強大,高效的處理正則表達式。一些復雜的任務,可以解決簡單的正則表達式。任何命令行專家都知道正則表達式的威力。
本教程介紹了標準的正則表達式,POSIX類的正則表達式和元字符。考慮我們有一個文本文件 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標準的正則表達式
行開始 (^)
插入符號(^)符號用于一行的開始匹配。下面的例子打印所有的啟動與模式“the”行。
[jerry]$ sed -n '/^The/ p' books.txt執行上面的代碼,會得到如下結果:
The Two Towers, J. R. R. Tolkien The Alchemist, Paulo Coelho The Fellowship of the Ring, J. R. R. Tolkien The Pilgrimage, Paulo Coelho行尾 ($)
行尾是由美元符號($)符號表示。下面的例子打印“Coelho”結尾的行。
[jerry]$ sed -n '/Coelho$/ p' books.txt執行上面的代碼,會得到如下結果:
The Alchemist, Paulo Coelho The Pilgrimage, Paulo Coelho單個字符(.)
點(.)匹配除行字符結尾的任何單個字符。下面的例子打印所有三個字母的單詞字符 “t” 結尾。
[jerry]$ echo -e "cat\nbat\nrat\nmat\nbatting\nrats\nmats" | sed -n '/^..t$/p'執行上面的代碼,會得到如下結果:
cat bat rat mat匹配字符集合 ([])
字符集是用方括號([])表示。它用來匹配只有1個之中的幾個字符。下面的例子匹配模式“Call”和“Tall”,而不是“Ball”。
[jerry]$ echo -e "Call\nTall\nBall" | sed -n '/[CT]all/ p'執行上面的代碼,會得到如下結果:
Call Tall獨有集 ([^])
當使用的字符集使用時,插入符否定集在方括號字符。只有下面的示例打印“Ball”。
[jerry]$ echo -e "Call\nTall\nBall" | sed -n '/[^CT]all/ p'執行上面的代碼,會得到如下結果:
Ball字符范圍 ([-])
當被提供的字符范圍,則正則表達式匹配在方括號中指定的范圍內的任何字符。下面的例子匹配“Call”和“Tall”,而不是“Ball”。
[jerry]$ echo -e "Call\nTall\nBall" | sed -n '/[C-Z]all/ p'執行上面的代碼,會得到如下結果:
Call Tall現在,讓我們修改范圍為“A-P”,并觀察結果。
[jerry]$ echo -e "Call\nTall\nBall" | sed -n '/[A-P]all/ p'執行上面的代碼,會得到如下結果:
Call Ball零到一次出現?(\?)
問號(\?)匹配零個或一個匹配前面的字符。下面的例子匹配“Behaviour”和“Behavior”。在這里,我們通過使用“\?”使“u”作為一個可選的字符。
[jerry]$ echo -e "Behaviour\nBehavior" | sed -n '/Behaviou\?r/ p'執行上面的代碼,會得到如下結果:
Behaviour Behavior一次或多次出現 (\+)
加號(\+)匹配前面的字符出現一次或多次。下面的例子匹配“2”出現一次或多次。
[jerry]$ echo -e "111\n22\n123\n234\n456\n222" | sed -n '/2\+/ p'執行上面的代碼,會得到如下結果:
22 123 234 222零或多次出現 (*)
星號(*)匹配零個或多個發生了前面的字符。下面的例子匹配"ca", "cat", "catt"等依此類推。
[jerry]$ echo -e "ca\ncat" | sed -n '/cat*/ p'執行上面的代碼,會得到如下結果:
ca catn個重復 {n}
{n}表達完全一致的“n”出現前面的字符。下面的例子打印只有三個數字。但在這之前,你需要創建以下文件,該文件僅包含數字。考慮 numbers.txt 有以下內容:
1 10 100 1000 10000 100000 1000000 10000000 100000000 1000000000現在讓我們編寫 Sed 表達式。在這里,對花括號中的“\”字符轉義。
[jerry]$ sed -n '/^[0-9]\{3\}$/ p' numbers.txt執行上面的代碼,會得到如下結果:
100最少出現n個 {n,}
{n,} 表達式匹配,至少是“n”出現前面的字符。下面的例子打印大于或等于5個數字的所有數字。
[jerry]$ sed -n '/^[0-9]\{5,\}$/ p' numbers.txt執行上面的代碼,會得到如下結果:
10000 100000 1000000 10000000 100000000 1000000000M到N次出現 {m, n}
{m, n} 表達式匹配,至少是“M”和最“N”出現前面的字符。下面的例子打印所有具有至少5個數字,但不超過8位的數字。
[jerry]$ sed -n '/^[0-9]\{5,8\}$/ p' numbers.txt執行上面的代碼,會得到如下結果:
10000 100000 1000000 10000000管道(|)
管道符的行為類似于邏輯或運算。它從管的兩側相匹配的條目。下面的例子要么匹配"str1" 和 "str3"。這里,一對括號和管道 (|) 由“\”字符轉義。
[jerry]$ echo -e "str1\nstr2\nstr3\nstr4" | sed -n '/str\(1\|3\)/ p'執行上面的代碼,會得到如下結果:
str1 str3字符轉義
有哪些有在Sed有特殊含義的特殊字符。例如,用“\n”表示換行,回車被為“\r”表示,依此類推。要使用這些字符轉換成普通的ASCII,我們必須使用反斜杠(\)字符轉義。本章說明了轉義特殊字符。
轉義 "\"
下面的例子匹配的模式“\”。
[jerry]$ echo 'str1\str2' | sed -n '/\\/ p'執行上面的代碼,會得到如下結果:
str1\str2轉義 "\n"
下面的示例將新行字符匹配。
[jerry]$ echo 'str1\nstr2' | sed -n '/\\n/ p'執行上面的代碼,會得到如下結果:
str1\nstr2轉義 "\r"
下面的例子回車匹配。
[jerry]$ echo 'str1\rstr2' | sed -n '/\\r/ p'執行上面的代碼,會得到如下結果:
str1\rstr2?轉義"\dnnn"
這個匹配一個字符的十進制ASCII碼值是“nnn”。下面的例子中只匹配字符“a”。
[jerry]$ echo -e "a\nb\nc" | sed -n '/\d97/ p'執行上面的代碼,會得到如下結果:
a轉義 "\onnn"
這個匹配字符的八進制ASCII碼值是“nnn”。下面的例子僅匹配字符“b”。
[jerry]$ echo -e "a\nb\nc" | sed -n '/\o142/ p'執行上面的代碼,會得到如下結果:
b這個匹配字符的十六進制ASCII碼值是“nnn”。下面的例子中只匹配字符“c”。
[jerry]$ echo -e "a\nb\nc" | sed -n '/\x63/ p'執行上面的代碼,會得到如下結果:
c正則表達式POSIX類
有哪些有Sed 特殊的含義一定的保留字。這些保留字被稱為POSIX類正則表達式。本節介紹Sed支持POSIX類。
[:alnum:]
這意味著按字母和數字字符。下面的例子只匹配“One”和“123”,但不匹配制表符。
[jerry]$ echo -e "One\n123\n\t" | sed -n '/[[:alnum:]]/ p'執行上面的代碼,會得到如下結果:
One 123[:alpha:]
這意味著只有字母字符。下面的例子只匹配單詞“One”。
[jerry]$ echo -e "One\n123\n\t" | sed -n '/[[:alpha:]]/ p'執行上面的代碼,會得到如下結果:
One[:blank:]
這意味著空白字符可以是任何空格或制表符。下面的例子只匹配制表符。
[jerry]$ echo -e "One\n123\n\t" | sed -n '/[[:space:]]/ p' | cat -vte執行上面的代碼,會得到如下結果:
^I$注意,該命令“cat -vte”用于顯示制表符(^ I)中。
[:digit:]
這意味著只有小數。下面的例子只匹配數字“123”。
[jerry]$ echo -e "abc\n123\n\t" | sed -n '/[[:digit:]]/ p'執行上面的代碼,會得到如下結果:
123[:lower:]
這意味著只有小寫字母。下面的例子只匹配“one”。
[jerry]$ echo -e "one\nTWO\n\t" | sed -n '/[[:lower:]]/ p'執行上面的代碼,會得到如下結果:
one[:upper:]
這意味著只有大寫字母。下面的例子只匹配 "TWO".
[jerry]$ echo -e "one\nTWO\n\t" | sed -n '/[[:upper:]]/ p'執行上面的代碼,會得到如下結果:
TWO[:punct:]
它意味著標點符號包括非空格或字母數字字符
[jerry]$ echo -e "One,Two\nThree\nFour" | sed -n '/[[:punct:]]/ p'執行上面的代碼,會得到如下結果:
One,Two[:space:]
這意味著空格字符。下面的例子說明了這一點。
[jerry]$ echo -e "One\n123\f\t" | sed -n '/[[:space:]]/ p' | cat -vte執行上面的代碼,會得到如下結果:
123^L^I$元字符
像傳統的正則表達式,Sed也支持特殊字符。這些是Perl風格正則表達式。需要注意的是元字符的支持是GNU Sed,可能無法與Sed的其他變種的工作。讓我們詳細討論的元字符。
單詞邊界 (\b)
“\b”元字符的字邊界匹配。例如,“\bthe\b”匹配“the”而不是"these", "there", "they", "then", 依此類推。下面的例子說明了這一點。
[jerry]$ echo -e "these\nthe\nthey\nthen" | sed -n '/\bthe\b/ p'執行上面的代碼,會得到如下結果:
the非單詞邊界(\B)
“\B”元字符匹配非單詞邊界。例如,“the\B”匹配“,這些”these“和“they”而不是“the”。下面的例子說明了這一點。
[jerry]$ echo -e "these\nthe\nthey" | sed -n '/the\B/ p'執行上面的代碼,會得到如下結果:
these they單空白 (\s)
“\s”元字符意味著單個空格字符。下面的例子匹配“Line\t1”,但不匹配“Line1”。
[jerry]$ echo -e "Line\t1\nLine2" | sed -n '/Line\s/ p'執行上面的代碼,會得到如下結果:
Line 1單非空白 (\S)
“\S”元字符意味著單個空格字符。下面的例子匹配“Line2”,但不匹配“Line\t1”。
[jerry]$ echo -e "Line\t1\nLine2" | sed -n '/Line\S/ p'執行上面的代碼,會得到如下結果:
Line2單字字符 (\w)
“\W”元字符意味著單個單詞字符,即字母字符,數字和下劃線(_)。下面的例子說明了這一點。
[jerry]$ echo -e "One\n123\n1_2\n&;#" | sed -n '/\w/ p'執行上面的代碼,會得到如下結果:
One 123 1_2單非單詞字符 (\W)
“\W”元字符意味著一個非單詞字符,以“\w”正好相反。下面的例子說明了這一點。
[jerry]$ echo -e "One\n123\n1_2\n&;#" | sed -n '/\W/ p'On executing the above code, you get the following result:
&;#模式空間的開始 (\`)
“\”'元字符意味著將模式空間的開始位置。下面的例子只匹配單詞“One”。
[jerry]$ echo -e "One\nTwo One" | sed -n '/\`One/ p'執行上面的代碼,會得到如下結果:
One
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. MartinCat 命令
在下面的示例中,每行被打印作為默認工作流程的一部分。
[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 -awc -l 命令
Unix的"wc -l" 命令的計數存在于文件中的行數。下面的sed表達式模擬相同。
[jerry]$ sed -n '$ =' hello.sh執行上面的代碼,會得到如下結果:
8head 命令
默認情況下,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 Coelhotail -1 命令
Unix的“tail -1”打印文件的最后一行。下面的語法顯示了模擬。
[jerry]$ sed -n '$p' books.txt執行上面的代碼,會得到如下結果:
A Game of Thrones, George R. R. Martindos2unix 命令
在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 $?執行上面的代碼,會得到如下結果:
0expand 命令
“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 $?執行上面的代碼,會得到如下結果:
0tee 命令
“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 #2cat -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 #3grep 命令
默認情況下,“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 #1grep -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
from: http://www.yiibai.com/sed/sed_useful_recipes.html
總結
以上是生活随笔為你收集整理的Sed教程(五):管理模式、正则表达式、使用功能的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Sed教程(四):基本命令、特殊字符、字
- 下一篇: Scala 指南