鍍金池/ 教程/ Linux/ Sed字符串
Sed字符串
Sed實(shí)用功能
Sed管理模式
sed環(huán)境設(shè)置
sed模式緩沖區(qū)
Sed循環(huán)
Sed模式范圍
Sed教程
Sed正則表達(dá)式
Sed分支
Sed基本語法
sed工作流程
Sed特殊字符
Sed基本命令

Sed字符串

本教程將介紹一些字符串處理的重要sed命令。考慮我們有一個(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, 864

替換命令

“查找和替換”文本替換操作字符串最常見。下面給出的是替換命令的語法:

[address1[,address2]]s/pattern/replacement/[flags]

這里,address1 和 address2分別是起始和結(jié)束地址,它可以是行號(hào)或模式串。這兩個(gè)地址是可選參數(shù)。

該模式是要替換的替換字符串的字符串。此外,也可以指定可選的標(biāo)志,以增強(qiáng)功能。

以下是 sed 命令替換所有books.txt 用逗號(hào)與豎線(|)。

[jerry]$ sed 's/,/ | /' books.txt

執(zhí)行上面的代碼,得到如下結(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, 864

如果仔細(xì)觀察,只有第一個(gè)逗號(hào)替換,第二保持原樣。為什么呢?只要模式匹配,Sed 替換為替換字符串并且移動(dòng)到下一行。默認(rèn)情況下,它僅替換第一次出現(xiàn)。要替換所有出現(xiàn)的,使用Sed全局標(biāo)志(g)如下:

[jerry]$ sed 's/,/ | /g' books.txt

執(zhí)行上面的代碼,得到如下結(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 |  864

可以指示Sed執(zhí)行文本替換,只有當(dāng)一個(gè)模式匹配成功。下面的示例替換逗號(hào)(,)用豎線(|)僅當(dāng)行包含模式。

[jerry]$ sed '/The Pilgrimage/ s/,/ | /g' books.txt 

執(zhí)行上面的代碼,得到如下結(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, 864

Sed 也可以取代的模式發(fā)生的特定事件。替換逗號(hào)(,)以豎線的唯一的第二個(gè)實(shí)例(|)。下面是在sed命令(或標(biāo)志的地方),當(dāng)前匹配的第二個(gè)出現(xiàn)的有多少。

[jerry]$ sed 's/,/ | /2' books.txt

執(zhí)行上面的代碼,得到如下結(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  | 864

可以使用P標(biāo)志,如下打印不僅改變的行:

[jerry]$ sed -n 's/Paulo Coelho/PAULO COELHO/p' books.txt

執(zhí)行上面的代碼,得到如下結(jié)果:

3) The Alchemist, PAULO COELHO, 197 
5) The Pilgrimage, PAULO COELHO, 288 

可以在另一個(gè)文件中保存更改的行。為了實(shí)現(xiàn)這種結(jié)果,可以使用 w 標(biāo)志如下所示:

[jerry]$ sed -n 's/Paulo Coelho/PAULO COELHO/w junk.txt' books.txt

現(xiàn)在 junk.txt 文件已全部更改的文件。讓我們驗(yàn)證 junk.txt 文件的內(nèi)容。

[jerry]$ cat junk.txt

執(zhí)行上面的代碼,得到如下結(jié)果:

3) The Alchemist, PAULO COELHO, 197 
5) The Pilgrimage, PAULO COELHO, 288

執(zhí)行不區(qū)分大小寫的替換,可以使用i標(biāo)志,這意味著忽略大小寫。下面的例子執(zhí)行不區(qū)分大小寫的替換。

[jerry]$ sed  -n 's/pAuLo CoElHo/PAULO COELHO/pi' books.txt

執(zhí)行上面的代碼,得到如下結(jié)果:

3) The Alchemist, PAULO COELHO, 197 
5) The Pilgrimage, PAULO COELHO, 288

非標(biāo)分隔符

通常,反斜杠(/)作為分隔符,但有時(shí)是用其它支持定界符以用 sed 更方便。

到目前為止,我們已經(jīng)使用了只有反斜杠(/)字符作為分隔符,但我們也可以使用豎線(|),at符號(hào)(@),插入符號(hào)(^),感嘆號(hào)作為分隔符(?。O旅娴氖纠菔玖巳绾问褂闷渌址鳛榉指舴?。

下面的例子使用豎線(|)作為分隔符:

[jerry]$ echo "/bin/sed" | sed 's|/bin/sed|/home/jerry/src/sed/sed-4.2.2/sed|'

執(zhí)行上面的代碼,得到如下結(jié)果:

/home/jerry/src/sed/sed-4.2.2/sed

同樣,我們可以用“at”符號(hào)(@)使用作為分隔符,如下所示:

[jerry]$ echo "/bin/sed" | sed 's@/bin/sed@/home/jerry/src/sed/sed-4.2.2/sed@'

執(zhí)行上面的代碼,得到如下結(jié)果:

/home/jerry/src/sed/sed-4.2.2/sed 

同樣,我們可以使用插入符號(hào)(^)作為分隔符,如下所示:

[jerry]$ echo "/bin/sed" | sed 's^/bin/sed^/home/jerry/src/sed/sed-4.2.2/sed^'

執(zhí)行上面的代碼,得到如下結(jié)果:

/home/jerry/src/sed/sed-4.2.2/sed 

同樣,我們可以使用感嘆號(hào)作為分隔符如下(?。?/p>

[jerry]$ echo "/bin/sed" | sed 's!/bin/sed!/home/jerry/src/sed/sed-4.2.2/sed!'

執(zhí)行上面的代碼,得到如下結(jié)果:

/home/jerry/src/sed/sed-4.2.2/sed 

創(chuàng)建一個(gè)子串

我們學(xué)到了強(qiáng)大的替換命令??纯词欠窨梢哉业揭粋€(gè)匹配的文本字符串。了解如何用一個(gè)例子來說明。

看看下面的文字:

[jerry]$ echo "Three One Two"

假設(shè)我們要安排成一個(gè)序列。意味著,它應(yīng)該打印一份,再兩個(gè),最后三個(gè)。下面的單行代碼執(zhí)行。

[jerry]$ echo "Three One Two" | sed 's|\(\w\+\) \(\w\+\) \(\w\+\)|\2 \3 \1|'

sed 子串可以通過使用分組操作員指定,并且它必須以轉(zhuǎn)義字符作為前綴,即\(和\)。

在這里,\ w是一個(gè)正則表達(dá)式匹配任何字母或下劃線和“+”號(hào)來匹配多個(gè)字符。換句話說,正則表達(dá)式 \(\w\+\)從輸入串中的單個(gè)字相匹配。

這個(gè)子串由\N,N是子串號(hào)轉(zhuǎn)介。因此,\2打印第二子串,即一個(gè); \3打印第三子串,即兩種;和\1打印第一子,即Three

讓我們分開這些話通過逗號(hào)(,)并相應(yīng)修改則表達(dá)式。

[jerry]$ echo "Three,One,Two" | sed 's|\(\w\+\),\(\w\+\),\(\w\+\)|\2,\3,\1|'

執(zhí)行上面的代碼,得到如下結(jié)果:

One,Two,Three

字符串替換標(biāo)志

GNU Sed 提供可在替換字符串中使用一些特殊的轉(zhuǎn)義序列。請(qǐng)注意,這些字符串替換標(biāo)志是GNU具體指定,可能無法與Sed其他變種進(jìn)行工作。在這里,我們將討論的字符串替換標(biāo)志。

 \L 標(biāo)識(shí)

當(dāng)在替換字符串中指定\L,它把該單詞的所有剩余的字符,\L以小寫字符。例如,字符“ULO”被視為小寫字符。

[jerry]$ sed -n 's/Paulo/PA\LULO/p' books.txt

執(zhí)行上面的代碼,得到如下結(jié)果:

3) The Alchemist, PAulo Coelho, 197
5) The Pilgrimage, PAulo Coelho, 288

\u 標(biāo)識(shí)

\u被替換字符串指定,它把后\u,如大寫字符前的字符。在下面的例子中,\u字符為'a'和'o'之前使用。因此,Sed將這些字符轉(zhuǎn)為大寫字母。

[jerry]$ sed -n 's/Paulo/p\uaul\uo/p' books.txt

執(zhí)行上面的代碼,得到如下結(jié)果:

3) The Alchemist, pAulO Coelho, 197 
5) The Pilgrimage, pAulO Coelho, 288

\U 標(biāo)識(shí)

當(dāng)\U在替換字符串中指定,把單詞的所有剩余的字符\U后為大寫字母。

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

執(zhí)行上面的代碼,得到如下結(jié)果:

3) The Alchemist, PAULO Coelho, 197 
5) The Pilgrimage, PAULO Coelho, 288

 \E 標(biāo)識(shí)

\E標(biāo)志應(yīng)使用\L或\U。它標(biāo)志\L或\U開始停止轉(zhuǎn)換。在下面的例子中,只有第一個(gè)字被替換為大寫字母。

[jerry]$ sed -n 's/Paulo Coelho/\Upaulo \Ecoelho/p' books.txt

執(zhí)行上面的代碼,得到如下結(jié)果:

3) The Alchemist, PAULO coelho, 197 
5) The Pilgrimage, PAULO coelho, 288