Sed教程(三):模式缓冲区、模式范围
我們對(duì)任何文件進(jìn)行基本操作,顯示其內(nèi)容。為了達(dá)到這個(gè)目的,我們可以用打印的模式緩沖區(qū)的打印命令。本教程將介紹更多的模式緩沖區(qū),以及如何打印使用相關(guān)模式緩沖區(qū)不同運(yùn)算符的文件的內(nèi)容。
考慮一下我們有一個(gè)文本文件books.txt待處理,它有以下內(nèi)容:
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, 864Sed p 命令
我們可以用Sed 'p'命令來打印指定文件的內(nèi)容。下面是一個(gè)簡單的命令來打印文件 books.txt 的內(nèi)容。
[jerry]$ sed 'p' books.txt當(dāng)執(zhí)行上面的代碼,就會(huì)產(chǎn)生下面的結(jié)果。
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讓我們找出為什么每個(gè)行被打印兩次。實(shí)際上,在默認(rèn)情況下,sed打印模式緩沖區(qū)的內(nèi)容。此外,我們已明確地接入命令部分?print ?命令。因此,每行打印了兩次。Sed有一個(gè)-n選項(xiàng)來抑制模式緩沖區(qū)的默認(rèn)打印。讓我們?cè)囋囅旅娴拿?#xff1a;
[jerry]$ sed -n 'p' books.txt當(dāng)執(zhí)行上面的代碼,就會(huì)產(chǎn)生下面的結(jié)果。
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, 864Sed 地址范圍
默認(rèn)情況下,sed在所有行上操作。但是,可以強(qiáng)制sed只在某些行上使用。例如,在下面的例子中,sed只運(yùn)行在第三行。在這個(gè)例子中,我們指定 sed 命令前一個(gè)地址范圍。
[jerry]$ sed -n '3p' books.txt當(dāng)執(zhí)行上面的代碼,就會(huì)產(chǎn)生下面的結(jié)果。
3) The Alchemist, Paulo Coelho, 197Sed comma 命令
下面的代碼打印2?5。這里我們使用了逗號(hào)(,)運(yùn)算符指定的地址范圍內(nèi)的所有行:
[jerry]$ sed -n '2,5 p' books.txt當(dāng)執(zhí)行上面的代碼,就會(huì)產(chǎn)生下面的結(jié)果。
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, 288Sed $ 運(yùn)算符
我們可以使用美元符號(hào)$運(yùn)算符來打印該文件的最后一行,如下所示:
[jerry]$ sed -n '$ p' books.txt當(dāng)執(zhí)行上面的代碼,就會(huì)產(chǎn)生下面的結(jié)果。
6) A Game of Thrones, George R. R. Martin, 864但是,我們也可以使用美元符號(hào)($)來指定一個(gè)地址范圍。下面的例子打印通過第3行到最后一行。
[jerry]$ sed -n '3,$ p' books.txt當(dāng)執(zhí)行上面的代碼,就會(huì)產(chǎn)生下面的結(jié)果。
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, 864Sed 加操作
sed的加號(hào)(+)運(yùn)算符可以用來與逗號(hào)(,)運(yùn)算符。例如M,+ n將打印的行數(shù)M,以下示例開始打印從第2行開始到下一個(gè)4行:
[jerry]$ sed -n '2,+4 p' books.txt當(dāng)執(zhí)行上面的代碼,就會(huì)產(chǎn)生下面的結(jié)果。
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, 864Sed 波浪線運(yùn)算符
或者,我們也可以使用波浪符號(hào)(?)運(yùn)算符指定的地址范圍。它采用M?n形式。這表明 sed 應(yīng)該開始行數(shù)M和處理每n(次)行。例如,50?5行號(hào)50,55,60,65,等等。讓我們從打印的文件只有奇數(shù)行。
[jerry]$ sed -n '1~2 p' books.txt當(dāng)執(zhí)行上面的代碼,就會(huì)產(chǎn)生下面的結(jié)果。
1) A Storm of Swords, George R. R. Martin, 1216 3) The Alchemist, Paulo Coelho, 197 5) The Pilgrimage, Paulo Coelho, 288下面的代碼僅打印偶數(shù)行的文件。
[jerry]$ sed -n '2~2 p' books.txt當(dāng)執(zhí)行上面的代碼,就會(huì)產(chǎn)生下面的結(jié)果。
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
本教程介紹如何sed處理一個(gè)模式范圍。模式范圍可以是一個(gè)簡單的文本或復(fù)雜的正則表達(dá)式。我們將開始使用下列內(nèi)容的文本文件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執(zhí)行上面的代碼,會(huì)得到如下結(jié)果:
3) The Alchemist, Paulo Coelho, 197 5) The Pilgrimage, Paulo Coelho, 288Sed通常運(yùn)行在每一行,并只打印那些符合使用模式的給定條件的行。
我們還可以將一個(gè)模式范圍,地址范圍。下面的例子打印起始行具有Alchemist 的第一行匹配,直到第五行。
[jerry]$ sed -n '/Alchemist/, 5 p' books.txt執(zhí)行上面的代碼,會(huì)得到如下結(jié)果:
3) The Alchemist, Paulo Coelho, 197 4) The Fellowship of the Ring, J. R. R. Tolkien, 432 5) The Pilgrimage, Paulo Coelho, 288可以使用美元符號(hào)($)發(fā)現(xiàn)的模式第一次出現(xiàn)后打印的所有行。下面的示例查找字符串Fellowship的第一次出現(xiàn),并立即打印該文件中的其余行
[jerry]$ sed -n '/The/,$ p' books.txt執(zhí)行上面的代碼,會(huì)得到如下結(jié)果:
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也可以指定多個(gè)模式范圍使用逗號(hào)(,)運(yùn)算符。下面的例子打印所有模式?Two?和?Pilgrimage?之間存在的行。?
[jerry]$ sed -n '/Two/, /Pilgrimage/ p' books.txt執(zhí)行上面的代碼,會(huì)得到如下結(jié)果:
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此外,我們還可以在模式范圍使用的加號(hào)(+)運(yùn)算。下面的例子中發(fā)現(xiàn)模式Two第一次出現(xiàn),并打印它之后的下一個(gè)4行。
[jerry]$ sed -n '/Two/, +4 p' books.txt執(zhí)行上面的代碼,會(huì)得到如下結(jié)果:
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在這里,只給出了幾個(gè)例子來熟悉sed。可以自己結(jié)合上面例子寫幾個(gè)例子試試。
from: http://www.yiibai.com/sed/sed_useful_recipes.html
總結(jié)
以上是生活随笔為你收集整理的Sed教程(三):模式缓冲区、模式范围的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Sed教程(二):基本语法、循环、分支
- 下一篇: Sed教程(四):基本命令、特殊字符、字