- Sed 教程
- Sed - 首頁
- Sed - 概述
- Sed - 環境
- Sed - 工作流程
- Sed - 基本語法
- Sed - 迴圈
- Sed - 分支
- Sed - 模式緩衝區
- Sed - 模式範圍
- Sed - 基本命令
- Sed - 特殊字元
- Sed - 字串
- Sed - 模式管理
- Sed - 正則表示式
- Sed - 實用技巧
- Sed 有用資源
- Sed - 快速指南
- Sed - 有用資源
- Sed - 討論
流編輯器 - 模式緩衝區
我們在任何檔案上執行的基本操作之一是顯示其內容。為此,我們可以使用 **print** 命令,它列印模式緩衝區的內容。因此,讓我們更多地瞭解模式緩衝區。
首先建立一個包含行號、書籍名稱、作者和頁數的檔案。在本教程中,我們將使用此檔案。您可以根據您的方便使用任何文字檔案。我們的文字檔案將如下所示
[jerry]$ vi 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
現在,讓我們列印檔案內容。
[jerry]$ sed 'p' books.txt
執行上述程式碼後,將產生以下結果。
1) A Storm of Swords, George R. R. Martin, 1216 1) A Storm of Swords, George R. R. Martin, 1216 2) The Two Towers, J. R. R. Tolkien, 352 2) The Two Towers, J. R. R. Tolkien, 352 3) The Alchemist, Paulo Coelho, 197 3) The Alchemist, Paulo Coelho, 197 4) The Fellowship of the Ring, J. R. R. Tolkien, 432 4) The Fellowship of the Ring, J. R. R. Tolkien, 432 5) The Pilgrimage, Paulo Coelho, 288 5) The Pilgrimage, Paulo Coelho, 288 6) A Game of Thrones, George R. R. Martin, 864 6) A Game of Thrones, George R. R. Martin, 864
您可能想知道為什麼每行都顯示了兩次。讓我們找出原因。
您還記得 SED 的工作流程嗎?預設情況下,SED 會列印模式緩衝區的內容。此外,我們在命令部分顯式地包含了一個 print 命令。因此每行都列印了兩次。但不用擔心。SED 有 **-n** 選項來抑制模式緩衝區的預設列印。以下命令說明了這一點。
[jerry]$ sed -n 'p' 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
恭喜!我們得到了預期的結果。預設情況下,SED 對所有行進行操作。但是我們可以強制 SED 僅對某些行進行操作。例如,在下面的示例中,SED 僅對第 3 行進行操作。在此示例中,我們在 SED 命令之前指定了一個地址範圍。
[jerry]$ sed -n '3p' books.txt
執行上述程式碼後,將產生以下結果。
3) The Alchemist, Paulo Coelho, 197
此外,我們還可以指示 SED 僅列印某些行。例如,以下程式碼列印第 2 行到第 5 行的所有行。在這裡,我們使用了逗號 (,) 運算子來指定地址範圍。
[jerry]$ sed -n '2,5 p' books.txt
執行上述程式碼後,將產生以下結果。
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
還有一個特殊字元美元符號 ($) 表示檔案的最後一行。因此,讓我們列印檔案的最後一行。
[jerry]$ sed -n '$ p' books.txt
執行上述程式碼後,將產生以下結果。
6) A Game of Thrones, George R. R. Martin, 864
但是我們也可以使用美元符號 ($) 來指定地址範圍。下面的示例列印從第 3 行到最後一行。
[jerry]$ sed -n '3,$ p' books.txt
執行上述程式碼後,將產生以下結果。
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
我們學習瞭如何使用逗號 (,) 運算子來指定地址範圍。SED 支援另外兩個可以用來指定地址範圍的運算子。第一個是加號 (+) 運算子,它可以與逗號 (,) 運算子一起使用。例如,**M,+n** 將列印從行號 **M** 開始的接下來的 **n** 行。聽起來令人困惑?讓我們用一個簡單的例子來檢查一下。以下示例列印從第 2 行開始的接下來的 4 行。
[jerry]$ sed -n '2,+4 p' books.txt
執行上述程式碼後,將產生以下結果。
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
或者,我們也可以使用波浪號 (~) 運算子指定地址範圍。它使用 **M~n** 格式。它表示 SED 應該從行號 M 開始並處理每第 n 行。例如,**50~5** 匹配行號 50、55、60、65 等。讓我們僅列印檔案中的奇數行。
[jerry]$ sed -n '1~2 p' books.txt
執行上述程式碼後,將產生以下結果。
1) A Storm of Swords, George R. R. Martin, 1216 3) The Alchemist, Paulo Coelho, 197 5) The Pilgrimage, Paulo Coelho, 288
以下程式碼僅列印檔案中的偶數行。
[jerry]$ sed -n '2~2 p' books.txt
執行上述程式碼後,將產生以下結果。
2) The Two Towers, J. R. R. Tolkien, 352 4) The Fellowship of the Ring, J. R. R. Tolkien, 432 6) A Game of Thrones, George R. R. Martin, 864