sed模式緩衝區
我們對任何文件進行基本操作,顯示其內容。爲了達到這個目的,我們可以用打印的模式緩衝區的打印命令。本教程將介紹更多的模式緩衝區,以及如何打印使用相關模式緩衝區不同運算符的文件的內容。
考慮一下我們有一個文本文件books.txt待處理,它有以下內容:
- A Storm of Swords, George R. R. Martin, 1216
- The Two Towers, J. R. R. Tolkien, 352
- The Alchemist, Paulo Coelho, 197
- The Fellowship of the Ring, J. R. R. Tolkien, 432
- The Pilgrimage, Paulo Coelho, 288
- A Game of Thrones, George R. R. Martin, 864
Sed p 命令
我們可以用Sed 'p'命令來打印指定文件的內容。下面是一個簡單的命令來打印文件 books.txt 的內容。
[jerry]$ sed 'p' books.txt
當執行上面的代碼,就會產生下面的結果。
- A Storm of Swords, George R. R. Martin, 1216
- A Storm of Swords, George R. R. Martin, 1216
- The Two Towers, J. R. R. Tolkien, 352
- The Two Towers, J. R. R. Tolkien, 352
- The Alchemist, Paulo Coelho, 197
- The Alchemist, Paulo Coelho, 197
- The Fellowship of the Ring, J. R. R. Tolkien, 432
- The Fellowship of the Ring, J. R. R. Tolkien, 432
- The Pilgrimage, Paulo Coelho, 288
- The Pilgrimage, Paulo Coelho, 288
- A Game of Thrones, George R. R. Martin, 864
- A Game of Thrones, George R. R. Martin, 864
讓我們找出爲什麼每個行被打印兩次。實際上,在默認情況下,sed打印模式緩衝區的內容。此外,我們已明確地接入命令部分 print 命令。因此,每行打印了兩次。Sed有一個-n選項來抑制模式緩衝區的默認打印。讓我們試試下面的命令:
[jerry]$ sed -n 'p' books.txt
當執行上面的代碼,就會產生下面的結果。
- A Storm of Swords, George R. R. Martin, 1216
- The Two Towers, J. R. R. Tolkien, 352
- The Alchemist, Paulo Coelho, 197
- The Fellowship of the Ring, J. R. R. Tolkien, 432
- The Pilgrimage, Paulo Coelho, 288
- A Game of Thrones, George R. R. Martin, 864
Sed 地址範圍
默認情況下,sed在所有行上操作。但是,可以強制sed只在某些行上使用。例如,在下面的例子中,sed只運行在第三行。在這個例子中,我們指定 sed 命令前一個地址範圍。
[jerry]$ sed -n '3p' books.txt
當執行上面的代碼,就會產生下面的結果。
- The Alchemist, Paulo Coelho, 197
Sed comma 命令
下面的代碼打印2〜5。這裏我們使用了逗號(,)運算符指定的地址範圍內的所有行:
[jerry]$ sed -n '2,5 p' books.txt
當執行上面的代碼,就會產生下面的結果。
- The Two Towers, J. R. R. Tolkien, 352
- The Alchemist, Paulo Coelho, 197
- The Fellowship of the Ring, J. R. R. Tolkien, 432
- The Pilgrimage, Paulo Coelho, 288
Sed $ 運算符
我們可以使用美元符號$運算符來打印該文件的最後一行,如下所示:
[jerry]$ sed -n '$ p' books.txt
當執行上面的代碼,就會產生下面的結果。
- A Game of Thrones, George R. R. Martin, 864
但是,我們也可以使用美元符號($)來指定一個地址範圍。下面的例子打印通過第3行到最後一行。
[jerry]$ sed -n '3,$ p' books.txt
當執行上面的代碼,就會產生下面的結果。
- The Alchemist, Paulo Coelho, 197
- The Fellowship of the Ring, J. R. R. Tolkien, 432
- The Pilgrimage, Paulo Coelho, 288
- A Game of Thrones, George R. R. Martin, 864
Sed 加操作
sed的加號(+)運算符可以用來與逗號(,)運算符。例如M,+ n將打印的行數M,以下示例開始打印從第2行開始到下一個4行:
[jerry]$ sed -n '2,+4 p' books.txt
當執行上面的代碼,就會產生下面的結果。
- The Two Towers, J. R. R. Tolkien, 352
- The Alchemist, Paulo Coelho, 197
- The Fellowship of the Ring, J. R. R. Tolkien, 432
- The Pilgrimage, Paulo Coelho, 288
- A Game of Thrones, George R. R. Martin, 864
Sed 波浪線運算符
或者,我們也可以使用波浪符號(〜)運算符指定的地址範圍。它採用M〜n形式。這表明 sed 應該開始行數M和處理每n(次)行。例如,50〜5行號50,55,60,65,等等。讓我們從打印的文件只有奇數行。
[jerry]$ sed -n '1~2 p' books.txt
當執行上面的代碼,就會產生下面的結果。
- A Storm of Swords, George R. R. Martin, 1216
- The Alchemist, Paulo Coelho, 197
- The Pilgrimage, Paulo Coelho, 288
下面的代碼僅打印偶數行的文件。
[jerry]$ sed -n '2~2 p' books.txt
當執行上面的代碼,就會產生下面的結果。
- The Two Towers, J. R. R. Tolkien, 352
- The Fellowship of the Ring, J. R. R. Tolkien, 432
- A Game of Thrones, George R. R. Martin, 864