
- Sed 教程
- Sed - 首頁
- Sed - 概述
- Sed - 環境
- Sed - 工作流程
- Sed - 基本語法
- Sed - 迴圈
- Sed - 分支
- Sed - 模式緩衝區
- Sed - 模式範圍
- Sed - 基本命令
- Sed - 特殊字元
- Sed - 字串
- Sed - 模式管理
- Sed - 正則表示式
- Sed - 有用技巧
- Sed 有用資源
- Sed - 快速指南
- Sed - 有用資源
- Sed - 討論
流編輯器 - 模式管理
我們已經討論了模式緩衝區和保持緩衝區的使用。在本章中,我們將進一步探討它們的用法。讓我們討論一下n命令,它列印模式空間的內容。它將與其他命令結合使用。以下是n命令的語法。
[address1[,address2]]n
讓我們舉個例子。
[jerry]$ sed 'n' books.txt
執行上述程式碼後,將產生以下結果
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命令列印模式緩衝區的內容,清除模式緩衝區,將下一行讀取到模式緩衝區,並在其上應用命令。
讓我們假設在n命令之前有三個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檔案。假設該檔案包含書名及其作者姓名。修改後,檔案應如下所示
[jerry]$ cat 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 Thrones
h命令處理保持緩衝區。它將資料從模式緩衝區複製到保持緩衝區。保持緩衝區中的現有資料將被覆蓋。請注意,h命令不會移動資料,它只會複製資料。因此,複製的資料在模式緩衝區中保持不變。以下是h命令的語法。
[address1[,address2]]h
以下命令只打印作者Paulo Coelho的書名。
[jerry]$ sed -n '/Paulo/!h; /Paulo/{x;p}' books.txt
執行上述程式碼後,您將得到以下結果
The Alchemist The Pilgrimage
讓我們瞭解一下上述命令是如何工作的。books.txt的內容遵循特定的格式。第一行是書名,後面跟著書的作者。在上面的命令中,“!”用於反轉條件,即只有在模式匹配不成功時才將行復制到保持緩衝區。花括號{}用於組合多個SED命令
在命令的第一次遍歷中,SED將第一行,即《A Storm of Swords》讀取到模式緩衝區,並檢查它是否包含模式Paulo。由於模式匹配不成功,它將此行復制到保持緩衝區。現在模式緩衝區和保持緩衝區都包含相同的行,即《A Storm of Swords》。在第二步中,它檢查該行是否包含模式Paulo。由於模式不匹配,它什麼也不做。
在第二次遍歷中,它將下一行George R. R. Martin讀取到模式緩衝區,並應用相同的步驟。對於接下來的三行,它執行相同的操作。在第五次遍歷結束時,兩個緩衝區都包含《The Alchemist》。在第六次遍歷開始時,它讀取行Paulo Coelho,並且由於模式匹配,它不會將此行復制到保持緩衝區。因此,模式緩衝區包含Paulo Coelho,保持緩衝區包含《The Alchemist》。
此後,它檢查模式緩衝區是否包含模式Paulo。由於模式匹配成功,它將模式緩衝區的內容與保持緩衝區的內容交換。現在模式緩衝區包含《The Alchemist》,保持緩衝區包含Paulo Coelho。最後,它列印模式緩衝區的內容。相同的步驟應用於模式《The Pilgrimage》。
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 Coelho
我們學習瞭如何將模式緩衝區的內容複製/追加到保持緩衝區。我們能否也執行反向函式?當然可以!為此,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 Pilgrimage
第一個命令保持不變。在第五次遍歷結束時,兩個緩衝區都包含《The Alchemist》。在第六次遍歷開始時,它讀取行Paulo Coelho,並且由於模式匹配,它不會將此行復制到保持緩衝區。因此,模式空間包含Paulo Coelho,保持空間包含《The Alchemist》。
此後,它檢查模式空間是否包含模式Paulo。由於模式匹配成功,它首先列印模式空間的內容,即Paulo Coelho,然後它將保持緩衝區複製到模式緩衝區。因此,模式緩衝區和保持緩衝區都包含《The Alchemist》。最後,它列印模式緩衝區的內容。相同的步驟應用於模式《The Pilgrimage》。
類似地,我們可以將保持緩衝區的內容追加到模式緩衝區。SED提供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