每個(gè) Linux 管理員都應(yīng)該知道的十個(gè) sed 單行命令(附真實(shí)示例)
在日常的Linux系統(tǒng)管理與運(yùn)維工作中,文本處理是一項(xiàng)高頻且重要的操作。本文將深入探討十個(gè)適合初學(xué)者的sed單行命令,通過(guò)這些命令,你將能夠直接從終端高效地搜索、替換和操作文本,大幅提升工作效率。

一、Linux用戶(hù)應(yīng)該知道的sed單行命令
sed,即“流編輯器”(Stream Editor),是Linux系統(tǒng)中極為強(qiáng)大的文本處理工具。它集搜索、查找、替換、刪除和編輯等功能于一身,所有操作均可在終端完成,無(wú)需借助復(fù)雜的圖形化文本編輯器。無(wú)論是清理雜亂的文件、調(diào)整系統(tǒng)配置,還是自動(dòng)化繁瑣的文本編輯任務(wù),sed都能發(fā)揮巨大作用。
接下來(lái),我們將展示10個(gè)必須掌握的sed單行命令,并通過(guò)可在本地運(yùn)行的真實(shí)示例進(jìn)行逐步講解。即使你是sed的初學(xué)者,也能輕松上手,快速掌握這些實(shí)用技巧。
二、真實(shí)示例:創(chuàng)建測(cè)試文件
為了讓大家更直觀(guān)地感受sed命令的實(shí)際效果,我們先創(chuàng)建一個(gè)小型的真實(shí)樣例文件。這個(gè)文件模擬了配置文件、日志或簡(jiǎn)單報(bào)告中的文本內(nèi)容,方便你親自運(yùn)行sed命令,并觀(guān)察文本內(nèi)容的變化。
在終端中運(yùn)行以下命令:
cat <<EOF > sample.txt
Welcome to Tecmint
This is a test file
The quick brown fox
jumps over the lazy dog
Foo bar foo
Pattern is here
Whitespace at end
Leading whitespace
EOF上述命令使用了here-document(<<EOF)語(yǔ)法,它能夠?qū)⒍嘈形谋局苯硬迦氲矫麨閟ample.txt的新文件中。當(dāng)你按下回車(chē)鍵后,所有文本行將被寫(xiě)入文件,直到遇到末尾的EOF標(biāo)記。
此時(shí),你可以使用cat sample.txt或less sample.txt命令打開(kāi)文件。在文件中,你會(huì)看到多種不同類(lèi)型的內(nèi)容,包括普通文本、空行、重復(fù)單詞(foo和bar)、帶末尾空格的行以及帶前導(dǎo)空格的行。這些精心設(shè)置的不同元素,將用于演示sed在處理真實(shí)場(chǎng)景中文本時(shí)的強(qiáng)大能力。
1. 原地替換文件中的單詞
搜索并替換特定單詞或模式,是sed最常見(jiàn)且實(shí)用的功能之一。
假設(shè)在sample.txt文件中,單詞foo出現(xiàn)了多次,現(xiàn)在我們想要將所有foo的實(shí)例都改為大寫(xiě)的FOO,可以使用以下命令:
sed -i 's/foo/FOO/g' sample.txt這里,-i選項(xiàng)表示原地編輯文件,直接修改sample.txt的內(nèi)容;s是替換命令,foo是要查找的單詞,F(xiàn)OO是替換后的內(nèi)容,g表示全局替換,即替換每行中所有匹配的實(shí)例。
在編輯重要文件時(shí),為了避免意外丟失數(shù)據(jù),建議先創(chuàng)建備份??梢酝ㄟ^(guò)在-i標(biāo)志后添加備份擴(kuò)展名來(lái)實(shí)現(xiàn):
sed -i.bak 's/foo/FOO/g' sample.txt執(zhí)行該命令后,sample.txt文件會(huì)被編輯,同時(shí)會(huì)創(chuàng)建一個(gè)名為sample.txt.bak的備份文件,其中包含原始內(nèi)容,這樣即使操作出現(xiàn)問(wèn)題,也能恢復(fù)到原始狀態(tài)。
2. 刪除空行
在處理配置文件、日志或腳本時(shí),經(jīng)常會(huì)遇到不必要的空行。雖然這些空行不會(huì)影響文件的功能,但會(huì)使文件顯得雜亂無(wú)章,尤其是在排查問(wèn)題或查看大量輸出內(nèi)容時(shí),會(huì)增加閱讀和分析的難度。
使用以下單行命令可以刪除文件中的所有空行:
sed '/^$/d' sample.txt在這個(gè)命令中,/^$/表示匹配空行,^表示行首,$表示行尾,中間沒(méi)有任何字符即代表空行;d是刪除命令,sed會(huì)將匹配到的空行刪除。
如果你希望保留原始文件,將清理后的結(jié)果保存到新文件中,可以使用重定向操作:
sed '/^$/d' sample.txt > cleaned.txt這樣,原始的sample.txt文件保持不變,清理后的版本會(huì)被單獨(dú)保存到cleaned.txt文件中。
3. 打印特定行
在實(shí)際工作中,有時(shí)并不需要處理整個(gè)文件,只需查看特定行范圍的內(nèi)容,例如調(diào)試腳本、查看配置文件的關(guān)鍵部分,或從日志中提取相關(guān)片段。
要僅打印sample.txt文件中的第2到第4行,可以使用以下命令:
sed -n '2,4p' sample.txt-n選項(xiàng)表示禁止sed輸出默認(rèn)的處理結(jié)果,只輸出我們指定的內(nèi)容;2,4p中的2,4表示行號(hào)范圍,p是打印命令。對(duì)sample.txt運(yùn)行此命令后,輸出如下:
This is a test file
The quick brown fox
jumps over the lazy dog4. 刪除特定行
在某些情況下,我們需要從文件中刪除特定行,比如刪除拼寫(xiě)錯(cuò)誤的行、損壞的配置信息或無(wú)用的內(nèi)容。
假設(shè)sample.txt文件的第3行內(nèi)容是The quick brown fox,現(xiàn)在要?jiǎng)h除這一行,可以運(yùn)行以下命令:
sed '3d' sample.txt默認(rèn)情況下,sed會(huì)將編輯結(jié)果打印到終端,但不會(huì)直接修改文件內(nèi)容,這樣可以讓我們安全地查看輸出效果。輸出示例如下:
1. Welcome to Tecmint
2. This is a test file
3. jumps over the lazy dog如果確定要直接編輯文件,可以添加-i標(biāo)志:
sed -i '3d' sample.txt5. 僅替換每行的首次出現(xiàn)
在處理文本文件時(shí),我們常常需要替換單詞或短語(yǔ),但有時(shí)只希望替換每行的第一次出現(xiàn),而不是所有實(shí)例。
使用以下命令可以實(shí)現(xiàn)這一需求:
sed 's/bar/BAR/' sample.txt該命令會(huì)將每行中第一個(gè)出現(xiàn)的bar改為大寫(xiě)的BAR,同一行中的其他bar保持不變。
如果想要替換每行的所有實(shí)例,則需要在命令末尾添加g標(biāo)志:
sed 's/bar/BAR/g' sample.txt6. 在模式前插入行
在編輯配置文件或腳本時(shí),有時(shí)需要在匹配特定模式的行前插入文本,例如添加注釋或新的指令。
使用以下命令可以實(shí)現(xiàn)這一操作:
sed '/Pattern/i Before this line' sample.txt在這個(gè)命令中,/Pattern/是搜索詞,sed會(huì)查找包含“Pattern”的行;i表示插入操作;“Before this line”是要插入的文本,它將被插入到匹配行之前。
7. 在模式后追加行
sed的另一個(gè)強(qiáng)大功能是可以在特定行后自動(dòng)插入新文本,這在處理配置文件、日志或大量輸出文件時(shí)非常實(shí)用。
在sed中,a命令表示追加操作,它會(huì)在匹配給定模式的每行后添加新行。使用以下命令:
sed '/Pattern/a After this line' sample.txt運(yùn)行該命令時(shí),sed會(huì)逐行掃描sample.txt文件,當(dāng)找到包含“Pattern”的行時(shí),不會(huì)修改原行內(nèi)容,而是在該行之后插入指定的新行內(nèi)容“After this line”。
8. 替換匹配模式的整行
有時(shí)我們需要完全替換整行內(nèi)容,而不是僅修改部分內(nèi)容,并且只替換包含特定關(guān)鍵字或模式的行。
使用以下命令可以實(shí)現(xiàn)這一功能:
sed '/Whitespace/c This line was replaced' sample.txt在這個(gè)命令中,/Whitespace/用于告訴sed查找包含“Whitespace”的行(注意:sed的匹配默認(rèn)區(qū)分大小寫(xiě));c This line was replaced表示將匹配到的行整行替換為指定的字符串"This line was replaced"。無(wú)論行中是“Whitespace at end”還是“ Leading whitespace”,sed都會(huì)刪除整行,并插入新的內(nèi)容。
9. 同時(shí)替換多個(gè)文件
在實(shí)際項(xiàng)目中,比如處理網(wǎng)站相關(guān)文件時(shí),可能會(huì)有數(shù)十甚至數(shù)百個(gè).html文件仍在使用舊的http://鏈接,而不是更安全的https://鏈接。如果手動(dòng)修改每個(gè)文件,效率會(huì)非常低。
此時(shí),sed可以幫助我們快速完成替換操作:
sed -i 's/http:/https:/g' *.html-i標(biāo)志表示原地編輯文件;'s/http:/https:/g'是替換命令,用于查找所有http:并替換為https:;末尾的g確保替換每行中的所有匹配項(xiàng);通配符*.html會(huì)匹配當(dāng)前目錄中所有以.html結(jié)尾的文件。
這個(gè)操作在網(wǎng)站遷移到HTTPS或清理代碼以增強(qiáng)安全性時(shí)非常有用,但一定要記得先備份文件!更安全的做法是自動(dòng)創(chuàng)建備份:
sed -i.bak 's/http:/https:/g' *.html10. 移除前導(dǎo)和trailing空格
在文本文件中,行首或行尾存在多余的空格或制表符是一種常見(jiàn)的格式問(wèn)題,尤其是在日志、配置文件或數(shù)據(jù)導(dǎo)出文件中。雖然這些空格看似無(wú)害,但可能會(huì)導(dǎo)致腳本執(zhí)行錯(cuò)誤、解析異常,甚至影響文本的視覺(jué)對(duì)齊效果。不過(guò),借助sed可以輕松解決這個(gè)問(wèn)題:
sed 's/^[ \t]*//;s/[ \t]*$//' sample.txt在這個(gè)命令中,s/^[ \t]*//用于移除所有前導(dǎo)空格(包括空格或制表符),其中^匹配行首,[ \t]*表示零個(gè)或多個(gè)空格或制表符;s/[ \t]*$//用于移除所有trailing空格,$表示錨定到行尾。分號(hào);允許我們?cè)趩蝹€(gè)sed命令中依次運(yùn)行兩個(gè)替換操作。
三、總結(jié)
通過(guò)本文的學(xué)習(xí),你已經(jīng)了解了10個(gè)實(shí)用的sed單行命令,并通過(guò)真實(shí)示例進(jìn)行了實(shí)踐。這些命令并非只是炫酷的技巧,而是在編輯配置文件、清理日志或自動(dòng)化重復(fù)文本編輯任務(wù)時(shí),能夠反復(fù)使用的高效工具。掌握這些sed命令,將極大地提升你在Linux系統(tǒng)中的文本處理能力,讓日常的系統(tǒng)管理與運(yùn)維工作更加輕松、高效。





























