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