Linux下Shell編程之sed命令的用法詳解
sed(stream editor)是一種流編輯器,它能夠?qū)ξ谋具M(jìn)行過濾和轉(zhuǎn)換。sed 的工作原理是按照指定的模式對輸入的文本行進(jìn)行匹配,然后對匹配到的行執(zhí)行相應(yīng)的編輯命令。sed 非常適合于在管道中處理文本數(shù)據(jù),并且可以用于自動(dòng)化腳本中的文本處理任務(wù)。
一、基本用法
sed [選項(xiàng)] '腳本' 文件名
腳本:是一個(gè)或多個(gè) sed 編輯命令的集合,用單引號(hào)括起來。
文件名:是要處理的文本文件。如果省略文件名,sed 將從標(biāo)準(zhǔn)輸入讀取數(shù)據(jù)。
常用選項(xiàng)
-e 腳本:直接在命令行中指定 sed 腳本。
-f 腳本文件:從指定的文件中讀取 sed 腳本。
-i[SUFFIX]:直接修改文件內(nèi)容,而不是輸出到標(biāo)準(zhǔn)輸出。如果指定了 SUFFIX,則備份原文件,并在其后添加該后綴。
-n:取消默認(rèn)輸出,只輸出 sed 腳本處理過的行。
編輯命令
a\ 文本:在匹配行之后插入新文本。
i\ 文本:在匹配行之前插入新文本。
c\ 文本:用新文本替換匹配行。
d:刪除匹配行。
p:打印匹配行。
s/原模式/新模式/[修飾符]:用新模式替換原模式。修飾符可以是 g(全局替換),p(打印替換結(jié)果),i(忽略大小寫)等。
模式空間與保持空間
模式空間:sed 處理文本時(shí),會(huì)將一行文本讀入模式空間,然后對其執(zhí)行腳本中的命令。處理完一行后,sed 會(huì)將模式空間的內(nèi)容輸出(除非使用了 -n 選項(xiàng)),然后讀取下一行。
保持空間:是 sed 的另一個(gè)緩沖區(qū),可以用于在腳本的不同部分之間傳遞數(shù)據(jù)。保持空間通常用于復(fù)雜的文本處理任務(wù)。
示例
示例 1:替換文本
將文件 example.txt 中所有的 "foo" 替換為 "bar":
sed 's/foo/bar/g' example.txt
示例 2:刪除行
刪除文件 example.txt 中所有包含 "baz" 的行:
sed '/baz/d' example.txt
示例 3:插入文本
在文件 example.txt 中所有包含 "qux" 的行之前插入一行 "Inserted line":
sed '/qux/i\Inserted line' example.txt
示例 4:打印特定行
打印文件 example.txt 中的第 2 到第 4 行:
sed -n '2,4p' example.txt
示例 5:使用保持空間交換兩行
假設(shè)你有一個(gè)文件 swap.txt,內(nèi)容如下:
Line 1
Line 2
Line 3
你想要交換第 1 行和第 3 行的位置??梢允褂靡韵?sed 腳本:
sed -e '1{h;d}' -e '3{G;s/\(.*\)\n\(.*\)/\2\n\1/}' swap.txt
解釋:
- 1{h;d}:當(dāng)處理第 1 行時(shí),將其保存到保持空間(h),然后刪除模式空間的內(nèi)容(d),不輸出。
- 3{G;s/\(.*\)\n\(.*\)/\2\n\1/}:當(dāng)處理第 3 行時(shí),將保持空間的內(nèi)容追加到模式空間(G),然后使用 s 命令交換兩行。
輸出將是:
Line 3
Line 2
Line 1
二、高級(jí)用法及技巧
1.使用地址范圍
sed 允許你指定地址范圍,以便對特定范圍內(nèi)的行執(zhí)行編輯命令。地址范圍可以是行號(hào)、正則表達(dá)式或兩者的組合。
- 行號(hào)范圍:例如,2,4 表示第 2 到第 4 行。
- 正則表達(dá)式范圍:例如,/start/,/end/ 表示從匹配 start 的行到匹配 end 的行(包括這兩行)。
示例:
# 刪除第 2 到第 4 行 sed '2,4d' example.txt # 從匹配 "start" 的行到匹配 "end" 的行,將 "foo" 替換為 "bar" sed '/start/,/end/s/foo/bar/g' example.txt
2.多命令組合
你可以使用 -e 選項(xiàng)或分號(hào) ; 來組合多個(gè) sed 命令。
示例:
# 使用 -e 選項(xiàng)組合命令 sed -e 's/foo/bar/g' -e '2,4d' example.txt # 使用分號(hào)組合命令 sed 's/foo/bar/g; 2,4d' example.txt
3.模式空間與保持空間的高級(jí)應(yīng)用
模式空間和保持空間是 sed 的兩個(gè)重要緩沖區(qū)。通過巧妙地使用它們,你可以執(zhí)行復(fù)雜的文本處理任務(wù)。
- 模式空間:用于存儲(chǔ)當(dāng)前處理的行。
- 保持空間:用于在腳本的不同部分之間傳遞數(shù)據(jù)。
示例:
# 反轉(zhuǎn)文件中的行順序 sed '1!G;h;$!d' example.txt
解釋:
- 1!G:對于非第一行,將保持空間的內(nèi)容追加到模式空間。
- h:將模式空間的內(nèi)容復(fù)制到保持空間。
- $!d:對于非最后一行,刪除模式空間的內(nèi)容(不輸出)。
4.分支與循環(huán)
sed 提供了分支(b 和 t 命令)和循環(huán)(: 和 ; 組合)的功能,可以用于構(gòu)建復(fù)雜的文本處理邏輯。
- 分支:b 命令用于無條件跳轉(zhuǎn),t 命令用于在成功執(zhí)行替換后跳轉(zhuǎn)。
- 循環(huán):使用 : 標(biāo)記一個(gè)標(biāo)簽,然后使用 ; 和 b 命令實(shí)現(xiàn)循環(huán)。
示例:
# 打印文件中的奇數(shù)行 sed -n 'n;p' example.txt
解釋:
- n:讀取下一行到模式空間,覆蓋當(dāng)前行。
- p:打印模式空間的內(nèi)容。
由于 n 命令會(huì)覆蓋當(dāng)前行,因此這個(gè)腳本會(huì)跳過偶數(shù)行并打印奇數(shù)行。
5.使用 sed 進(jìn)行文本分析和轉(zhuǎn)換
sed 非常適合于文本分析和轉(zhuǎn)換任務(wù)。通過結(jié)合使用正則表達(dá)式、地址范圍和編輯命令,你可以輕松地提取、修改和生成文本數(shù)據(jù)。
示例:
# 提取文件中的所有電子郵件地址 sed -n 's/.*<\([^>]*\)>.*/\1/p' example.txt
解釋:
- s/.*<\([^>]*\)>.*/\1/:使用正則表達(dá)式匹配電子郵件地址,并將其提取出來。
- p:打印匹配的結(jié)果。
這個(gè)示例假設(shè)電子郵件地址被尖括號(hào)包圍,例如 <email@example.com>。
到此這篇關(guān)于Linux下Shell編程之sed命令的用法詳解的文章就介紹到這了,更多相關(guān)Linux Shell sed命令內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Linux Shell 自動(dòng)交互功能實(shí)現(xiàn)
本文主要介紹了Linux Shell 自動(dòng)交互功能實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08shell腳本連接、讀寫、操作mysql數(shù)據(jù)庫實(shí)例
這篇文章主要介紹了shell腳本連接、讀寫、操作mysql數(shù)據(jù)庫實(shí)例,本文包含連接、讀取、插入、創(chuàng)建數(shù)據(jù)庫等操作示例,需要的朋友可以參考下2014-08-08Linux執(zhí)行.sh文件時(shí)提示No such file or directory該怎么辦(三種解決辦法)
本文通過三種方法給大家介紹Linux執(zhí)行.sh文件,提示No such file or directory錯(cuò)誤的解決辦法,感興趣的朋友跟著小編一起學(xué)習(xí)學(xué)習(xí)吧2015-10-10