sed 字符串

替換命令

諸如"find和replace"之類的文本替換操作在任何文本編輯器中都是常見(jiàn)的。在本節(jié)中,我們說(shuō)明了SED如何執(zhí)行文本替換。

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

在這里, address1 和 address2 分別是開(kāi)始地址和結(jié)束地址,可以是行號(hào)或模式字符串,這兩個(gè)地址都是可選參數(shù)。

在books.txt文件中,我們使用了逗號(hào)(,)分隔每一列,讓我們使用豎線(|)分隔每一列,為此,用豎線(|)替換逗號(hào)(,)。

$sed 's/,/| /' books.txt

執(zhí)行上述代碼后,您將得到以下輸出:

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ì)觀察,只會(huì)替換第一個(gè)逗號(hào),而第二個(gè)則保持不變。為什么?模式匹配后,SED就會(huì)用替換字符串替換它,然后移至下一行。默認(rèn)情況下,它僅替換第一次出現(xiàn)的情況。要替換所有出現(xiàn)的內(nèi)容,請(qǐng)按如下所示將帶有SED的全局標(biāo)志(g )用作:

$sed 's/,/| /g' books.txt

執(zhí)行上述代碼后,您將得到以下輸出:

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

現(xiàn)在,所有出現(xiàn)的逗號(hào)(,)都替換為豎線(|)。

我們可以指示SED僅在模式匹配成功時(shí)執(zhí)行文本替換。下面的示例僅當(dāng)一行包含模式The Pilgrimage時(shí),才用豎線(|)替換逗號(hào)(,)。

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

執(zhí)行上述代碼后,您將得到以下輸出:

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

讓我們僅用豎線(|)替換第二個(gè) 逗號(hào)(,)

$sed 's/,/| /2' books.txt

執(zhí)行上述代碼后,您將得到以下輸出:

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提供了一個(gè)有趣的函數(shù)。執(zhí)行替換后,SED提供一個(gè)選項(xiàng)以僅顯示更改的行。為此,SED使用 p 標(biāo)志引用打印。以下示例僅列出更改的行。

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

執(zhí)行上述代碼后,您將得到以下輸出:

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

我們也可以將更改的行存儲(chǔ)在另一個(gè)文件中。要獲得此輸出,請(qǐng)使用 w 標(biāo)志。以下示例顯示了如何執(zhí)行此操作。

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

我們使用了相同的SED命令。讓我們驗(yàn)證 junk.txt 文件的內(nèi)容。

$cat junk.txt

執(zhí)行上述代碼后,您將得到以下輸出:

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

要執(zhí)行不區(qū)分大小寫的替換,請(qǐng)使用i 標(biāo)志,該標(biāo)志表示忽略大小寫。以下示例執(zhí)行不區(qū)分大小寫的替換。

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

執(zhí)行上述代碼后,您將得到以下輸出:

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

讓我們假設(shè)您需要用 /home/cainiaoplus/src/sed/sed-4.2.2/sed替換路徑/bin/sed 。因此,您的SED命令看起來(lái)像這樣:

$echo "/bin/sed" | sed 's/\/bin\/sed/\/home\/cainiaoplus\/src\/sed\/sed-4.2.2\/sed/'

執(zhí)行上述代碼后,您將得到以下輸出:

/home/cainiaoplus/src/sed/sed-4.2.2/sed

我們可以使該命令更具可讀性和易懂性。讓我們使用豎線(|)作為定界符并查看輸出。

$echo "/bin/sed" | sed 's|/bin/sed|/home/cainiaoplus/src/sed/sed-4.2.2/sed|'

執(zhí)行上述代碼后,您將得到以下輸出:

/home/cainiaoplus/src/sed/sed-4.2.2/sed

確實(shí)!我們得到相同的輸出,語(yǔ)法更易讀。同樣,我們可以使用" at"符號(hào)(@)作為分隔符,如下所示:

$echo "/bin/sed" | sed 's@/bin/sed@/home/cainiaoplus/src/sed/sed-4.2.2/sed@'

執(zhí)行上述代碼后,您將得到以下輸出:

/home/cainiaoplus/src/sed/sed-4.2.2/sed

除此之外,我們可以使用caret(^)作為分隔符。

$echo "/bin/sed" | sed 's^/bin/sed^/home/cainiaoplus/src/sed/sed-4.2.2/sed^'

執(zhí)行上述代碼后,您將得到以下輸出:

/home/cainiaoplus/src/sed/sed-4.2.2/sed 

我們還可以使用感嘆號(hào)(!)作為定界符,如下所示:

$echo "/bin/sed" | sed 's!/bin/sed!/home/cainiaoplus/src/sed/sed-4.2.2/sed!'

執(zhí)行上述代碼后,您將得到以下輸出:

/home/cainiaoplus/src/sed/sed-4.2.2/sed

通常,反斜杠(/)用作分隔符,但有時(shí)將其他受支持的分隔符與SED一起使用更方便。

創(chuàng)建字符串

我們學(xué)習(xí)了強(qiáng)大的替代命令。讓我們看看是否可以從匹配的文本中找到一個(gè)子字符串。讓我們借助示例了解如何做到這一點(diǎn)。

讓我們考慮以下文本:

$echo "Three One Two"

假設(shè)我們必須將其排列成一個(gè)序列。就是說(shuō),它應(yīng)該先打印一個(gè),然后打印兩個(gè),最后打印三個(gè)。以下一線需要幫助。

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

請(qǐng)注意,在以上示例中,豎線(|)用作分隔符。

在SED中,可以使用分組運(yùn)算符指定子字符串,并且必須在子字符串前面加上轉(zhuǎn)義字符,即\(和\)。

? ? ?\w 是一個(gè)正則表達(dá)式,可以匹配任何字母,數(shù)字或下劃線,并且"+"用于匹配多個(gè)字符。換句話說(shuō),正則表達(dá)式\(\w\+\)匹配輸入字符串中單個(gè)單詞。

? ? ?\2 打印第二個(gè)子字符串,即 One;\3 打印第三個(gè)子字符串,即 Two; 和\1 打印第一個(gè)子字符串,即 Three

讓我們用逗號(hào)(,)分隔這些單詞,并相應(yīng)地修改正則表達(dá)式。

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

執(zhí)行上述代碼后,您將得到以下輸出:

One,Two,Three

請(qǐng)注意,現(xiàn)在在正則表達(dá)式中有逗號(hào)(,)而不是空格。

字符串替換

在上一節(jié)中,我們看到了替換命令的一些示例。 GNU SED提供了一些特殊的轉(zhuǎn)義序列,可以在替換字符串中使用。

  • \L : 當(dāng)\L的替換字符串被指定時(shí),它將該單詞之后的所有剩余字符都替換成小寫字符。如字符" ULO"被視為小寫字符。

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

執(zhí)行上述代碼后,您將得到以下輸出:

3) The Alchemist, PAulo Coelho, 197
5) The Pilgrimage, PAulo Coelho, 288
  • \u : 在替換字符串中指定\u時(shí),它將\u之后的立即字符視為大寫字符。

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

執(zhí)行上述代碼后,您將得到以下輸出:

3) The Alchemist, pAulO Coelho, 197 
5) The Pilgrimage, pAulO Coelho, 288
  • \U : 在替換字符串中指定\U時(shí),它將\U之后的單詞的所有剩余字符視為大寫字符。

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

執(zhí)行上述代碼后,您將得到以下輸出:

3) The Alchemist, PAULO Coelho, 197 
5) The Pilgrimage, PAULO Coelho, 288
  • \E : 此標(biāo)志應(yīng)與\L或\U一起使用。在下面的示例中,僅第一個(gè)單詞被大寫字母替換。

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

執(zhí)行上述代碼后,您將得到以下輸出:

3) The Alchemist, PAULO coelho, 197 
5) The Pilgrimage, PAULO coelho, 288
丰满人妻一级特黄a大片,午夜无码免费福利一级,欧美亚洲精品在线,国产婷婷成人久久Av免费高清