請關注本頭條号,每天堅持更新原創幹貨技術文章。
如需學習視訊,請在微信搜尋公衆号“智傳網優”直接開始自助視訊學習
1. 前言
本文主要講解Linux系統中的sed指令的作用與使用案例。
sed用于查找、過濾、文本替換、替換和插入、删除等文本操作。它是Linux/Unix系統提供的強大實用程式之一。我們可以在正規表達式中使用sed。使用sed指令之前,您應該至少對Linux正規表達式有基本的了解。
它提供了文本檔案的非互動式編輯,這就是為什麼它被用來自動編輯。它有兩個緩沖區-pattern buffer和hold buffer。sed在逐行讀取檔案時使用pattern buffer,并且将目前讀取的行插入到pattern buffer中,而hold buffer是一個長期存儲,它捕獲資訊,存儲資訊,并在需要時重用這些資訊。最初,兩者都是空的。SED指令用于執行不同的操作,甚至可以不打開檔案。
首先建立a.txt檔案,我将在該檔案上執行sed指令的操作。在本教程中,我使用了a.txt檔案解釋了所有的例子。如果我編寫每個sed指令的輸出,本文就會變得太長。是以,您可以先引用同一個檔案來練習所有的指令。
檢視a.txt的文本内容:
[[email protected] ~]# cat a.txt
輸出如下:
life isn't meant to be easy, life is meant to be lived.Try to learn & understand something new everyday in life.Respect everyone & most important love everyone.Don’t hesitate to ask for love & don’t hesitate to show love too.Life is too short to be shy.In life experience will help you differentiating right from wrong.

Linux/Unix中sed指令中的實用案例
2. 使用基本sed指令操作檔案
使用基本sed指令操作檔案
2.1 在每一行後面插入一行空白
[[email protected] ~]# sed G a.txt
2.2 在每一行後面插入兩行空白
[[email protected] ~]# sed 'G;G' a.txt
2.3 删除空行,并在每一行之後插入一個空行
[[email protected] ~]# sed '/^$/d;G' a.txt
2.4 在比對“love”的每一行上插入空行
[[email protected] ~]# sed '/love/{x;p;x;}' a.txt
2.5 在比對“love”的每一行下面插入空行
[[email protected] ~]# sed '/love/G' a.txt
2.6 在每一行的左邊插入5個空格
[[email protected] ~]# sed 's/^/ /' a.txt
3. 行編号
給檔案的每一行标上序号(左對齊)。=用于給行編号。用于數字和句子之間的制表符(TAB)
[[email protected] ~]# sed = a.txt | sed 'N;s///'
給檔案的每一行編号(左對齊,右對齊)。這個指令類似于cat -n filename
[[email protected] ~]# sed = a.txt | sed 'N; s/^/ /; s/ *(.{4,})/1 /'
為檔案的每一行編号,空行除外:
[[email protected] ~]# sed '/./=' a.txt | sed '/./N; s// /'
4. 删除指定行
删除特定行文法:
sed ‘nd’ filename
例如:
[[email protected] ~]# sed '5d' a.txt
删除最後一行文法:
sed ‘$d’ filename
删除從x到y的行
文法:
sed ‘x,yd’ filename
[[email protected] ~]# sed '3,5d' a.txt
從第N行開始删除文法:
sed ‘nth,$d’ filename
例如:
[[email protected] ~]# sed '2,$d' a.txt
删除内容比對的行:文法:
sed ‘/pattern/d’ filename
例如:
[[email protected] ~]# sed '/life/d' a.txt
删除從第n行開始的行以及從第n行開始的第2行
文法:
sed ‘n~2d’ filename
例如:
[[email protected] ~]# sed '3~2d' a.txt
删除與内容比對的行以及後面的兩行文法:
sed ‘/pattern/,+2d’ filename
例子:
[[email protected] ~]# sed '/easy/,+2d' a.txt
删除空行:
[[email protected] ~]# sed '/^$/d' a.txt
删除空行或以“#”開頭的行
[[email protected] ~]# sed -i '/^#/d;/^$/d' a.txt
5. 檢視或列印檔案
如果我們想檢視檔案的内容,那麼我們使用cat指令,如果我們想檢視任何檔案的底部和頂部内容,我們使用head和tail等工具。但是,如果我們需要檢視檔案中間的特定部分,該怎麼辦呢?在這裡,我們将讨論如何使用sed指令來檢視檔案指定部分。
檢視或列印檔案
檢視檔案x到y行的内容:
文法:
sed -n ‘x,yp’ filename
例子:
[[email protected] ~]# sed -n '2,5p' a.txt
檢視除給定範圍之外的整個檔案内容:文法:
sed ‘x,yd’ filename
例如:列印檔案,除了第2和第4行。
[[email protected] ~]# sed '2,4d' a.txt
列印檔案的第n行文法:
sed -n ‘address’p filename
例子:
[[email protected] ~]# sed -n '4'p a.txt
從第x行列印到第y行。文法:
sed -n ‘x,y’p filename
例子:
[[email protected] ~]# sed -n '4,6'p a.txt
隻列印最後一行文法:
sed -n '$'p filename
例如:
[[email protected] ~]# sed -n '$'p a.txt
列印檔案,從第n行到檔案結束文法:
sed -n ‘n,$p’ filename
例如:
sed -n '3,$'p a.txt
6. 列印比對内容
隻列印與指定比對内容的行
文法:
sed -n /pattern/p filename
例子:
[[email protected] ~]# sed -n /every/p a.txt
列印與指定内容比對的行。例如從比對行到第x行。文法:
sed -n ‘/pattern/,xp’ filename
例子:接下來列印與指定内容比對的行,第三行列印與指定内容everyone比對的行,是以它從第3行列印到第5行。如果要列印檔案直到結束,請使用$來代替5。
[[email protected] ~]# sed -n '/everyone/,5p' a.txt
列印第x行到比對的行,如果沒有找到比對内容,則列印到檔案的最後。文法:
sed -n ‘x,/pattern/p’ filename
例如:
sed -n '1,/everyone/p' a.txt
從比對的内容開始列印往下列印N行(不包括比對行)
sed -n ‘/pattern/,+xp’ filename
例子:
sed -n '/learn/,+2p' a.txt
7. 用sed指令替換檔案内容
用sed指令替換檔案内容
把life替換為leaves
sed 's/life/leaves/' a.txt
替換一行中出現的第n個比對内容文法:
sed ‘s/old_pattern/new_pattern/n’ filename
例子:替換比對内容行的第2個比對的内容:
[[email protected] ~]# sed 's/to/two/2' a.txt
我們寫“2”是因為我們替換了第二個出現的内容。同樣,你可以根據需要修改,比如修改為3或4等。
替換每一行中出現的所有比對内容:
[[email protected] ~]# sed 's/life/learn/g' a.txt
将比對内容從第n個開始替換為目标内容:文法:
sed ‘s/old_pattern/new_pattern/ng’ filename
例子:從每行第2個比對内容開始替換
[[email protected] ~]# sed 's/to/TWO/2g' a.txt
這個sed指令将每一行(上面的指令帶有g表示每一行)中出現的第二個、第三個等比對的to替換為TWO。
如果您希望隻列印替換行,那麼使用“-n”選項和“/p”列印标志來隻顯示替換行。
[[email protected] ~]# sed -n 's/to/TWO/p' a.txt
如果您希望列印替換的行兩次,那麼隻使用“/p”列印标記而不使用“-n”選項
[[email protected] ~]# sed 's/to/TWO/p' a.txt
替換特定行号上的比對内容。這裡,“m”是行号。
文法:
sed ‘m s/old_pattern/new_pattern/’ filename
例如:
[[email protected] ~]# sed '3 s/every/each/' a.txt
如果您隻想列印替換的行
[[email protected] ~]# sed -n '3 s/every/each/p' a.txt
在已定義的行範圍内替換字元串文法:
sed ‘x,y s/old_pattern/new_pattern/’ filename
x = 開始的行号y = 結束的行号
例子:
[[email protected] ~]# sed '2,5 s/to/TWO/' a.txt
注意:如果我們希望将比對内容操作到檔案的最後一行,可以使用$來代替y。
例如:
[[email protected] ~]# sed '2,$ s/to/TWO/' a.txt
如果您希望替換比對的内容以忽略字元大小寫(以大寫或小寫開頭),那麼有兩種方法可以替換這些比對的内容
首先,可以先/i的參數
文法:
sed ‘s/old_pattern/new_pattern/i’ filename
例如:
[[email protected] ~]# sed 's/life/Love/i' a.txt
第二種方法,可以使用正規表達式:
[[email protected] ~]# sed 's/[Ll]ife/Love/g' a.txt
将多個空格替換為單個空格
[[email protected] clang]# sed 's/ */ /g' filename
在指定比對内容的行裡,替換内容文法:
sed ‘/followed_pattern/ s/old_pattern/new_pattern/’ filename
例子:
[[email protected] ~]# sed '/is/ s/live/love/' a.txt
替換内容,除了第N行文法:
sed ‘n!s/old_pattern/new_pattern/’ filename
例子:
[[email protected] ~]# sed -i '5!s/life/love/' a.txt
8. 總結
通過本文的示範,您應該對sed指令的功能與作用應該有大緻的了解了吧?這些案例都很實用的,可以收藏起來以備不時之需。