Sed模式範圍

本教程介紹如何sed處理一個模式範圍。模式範圍可以是一個簡單的文本或複雜的正則表達式。我們將開始使用下列內容的文本文件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

下面的例子打印的作者所有書籍 Paulo Coelho

[jerry]$ sed -n '/Paulo/ p' books.txt

執行上面的代碼,會得到如下結果:

  1. The Alchemist, Paulo Coelho, 197
  2. The Pilgrimage, Paulo Coelho, 288

Sed通常運行在每一行,並只打印那些符合使用模式的給定條件的行。

我們還可以將一個模式範圍,地址範圍。下面的例子打印起始行具有Alchemist 的第一行匹配,直到第五行。

[jerry]$ sed -n '/Alchemist/, 5 p' books.txt

執行上面的代碼,會得到如下結果:

  1. The Alchemist, Paulo Coelho, 197
  2. The Fellowship of the Ring, J. R. R. Tolkien, 432
  3. The Pilgrimage, Paulo Coelho, 288

可以使用美元符號($)發現的模式第一次出現後打印的所有行。下面的示例查找字符串Fellowship的第一次出現,並立即打印該文件中的其餘行

[jerry]$ sed -n '/The/,$ p' books.txt

執行上面的代碼,會得到如下結果:

  1. The Fellowship of the Ring, J. R. R. Tolkien, 432
  2. The Pilgrimage, Paulo Coelho, 288
  3. A Game of Thrones, George R. R. Martin, 864

也可以指定多個模式範圍使用逗號(,)運算符。下面的例子打印所有模式 Two 和 Pilgrimage 之間存在的行。 

[jerry]$ sed -n '/Two/, /Pilgrimage/ p' books.txt

執行上面的代碼,會得到如下結果:

  1. The Two Towers, J. R. R. Tolkien, 352
  2. The Alchemist, Paulo Coelho, 197
  3. The Fellowship of the Ring, J. R. R. Tolkien, 432
  4. The Pilgrimage, Paulo Coelho, 288

此外,我們還可以在模式範圍使用的加號(+)運算。下面的例子中發現模式Two第一次出現,並打印它之後的下一個4行。

[jerry]$ sed -n '/Two/, +4 p' books.txt

執行上面的代碼,會得到如下結果:

  1. The Two Towers, J. R. R. Tolkien, 352
  2. The Alchemist, Paulo Coelho, 197
  3. The Fellowship of the Ring, J. R. R. Tolkien, 432
  4. The Pilgrimage, Paulo Coelho, 288
  5. A Game of Thrones, George R. R. Martin, 864

在這裏,只給出了幾個例子來熟悉sed。可以自己結合上面例子寫幾個例子試試。