目錄:
(一)sed基本語法
(二)sed實戰演練正則表達式
(一)sed基本語法
(1.1)sed是一項Linux系統命令,功能通awk相似,差異在於sed簡單,對列處理的功能要差一些,awk的功能複雜,對列處理的功能比較強大。sed的全稱是:Stream EDitor
(1.2)sed屬於行編輯器,sed做爲文本編輯器只是用來處理純ASCII碼的文本的,在操做文本的時候是逐行操做的,並不能一次性操做多行。sed做爲文本編輯器並不處理文本文件自己,每當處理一個文件的時候,它會逐行讀取文件,每次將一行讀取到內存空間中,而後在內存中完成編輯,而後將內存中編輯好的結果輸出到屏幕上,這個內存空間咱們稱之爲「模式空間」。sed並非每一行都處理,它會按照某種指定的模式進行過濾,即符合條件的咱們就處理,不符合模式條件的就不處理。sed把符合條件的行讀進模式空間進行匹配,若是匹配到了就會在模式空間中使用後面的編輯命令對其完成編輯,並將完成編輯的結果輸出到屏幕上來。
(1.3)默認狀況下,sed不編輯原文件,僅對模式空間中的數據作處理。其中sed命令的語法總結爲:「sed 'AddressCommand' file1 file2」
(1.4)首先對於sed命令中的Address部分,咱們能夠用如下的幾種方式來表示,第一種是「StartLine,EndLine」,好比「1,100」表示從第1行到第100行,其中$符號表示最後一行;第二種咱們可使用正則表達式「/RegExp/」,例如咱們可使用「/^root/」表示以root字符串開頭的行;第三種咱們可使用「/pattern1/,/pattern2/」表示第一次被pattern1匹配到的行開始至第一次被pattern2匹配到的行結束;第四種能夠以LineNumber表示指定的行;第五種方法咱們可使用「StartLine,+N」表示的是從startLine開始,向後的N行。
(1.5)參數d
(1.5.1)對於Command部分,首先第一個參數爲「d」,表示的是刪除符合條件的行,例如咱們以/etc/fstab文件爲例,使用「1,4d」刪除第1至第4行(圖1-2)。若是咱們但願刪除第5行到最後1行的內容,則可使用'5,$d'進行表示(圖1-3)。
# sed '1,4d' /etc/fstab---將/etc/fstab文件中的第1至第4行刪除
# sed '5,$d' /etc/fstab---將/etc/fstab文件中的第5行到最後一行刪除
(1.5.2)若是咱們指定刪除文件中字符串包含「oot」的全部行,咱們在vms002主機上將/etc/fstab文件拷貝到root用戶的家目錄下命名爲fstab文件,而且編輯以下的文件內容(圖1-4)。而後咱們使用「# sed '/oot/d' fstab」命令進行文本過濾,此時咱們發現過濾出來的內容中已經沒有了cat fstab中標紅的兩行了(圖1-5)。
# sed '/oot/d' fstab---刪除文件中字符串包含「oot」的全部行
(1.5.3)若是咱們但願刪除當前行到當前行的後2行內容,則可使用「1,+2d」的參數表示,此時咱們發現顯示的內容中第1行到第3行已通過濾掉了(圖1-6),若是咱們須要刪除須要刪除某一指定的行,則能夠直接數字加上字母d便可。
# sed '1,+2d' fstab---刪除第1行到第3行的內容
# sed '1d' fstab---刪除第1行的內容
(1.6)對於Command部分,接着第二個參數是「p」,表示的是顯示符合條件的行。好比如今咱們需求是顯示以「/」斜線開頭的行,此時咱們須要在sed命令後跟一個「-n」的參數,即「sed -n」表示靜默模式,再也不默認顯示模式空間中的內容。而「^/」表示的是以斜線開頭的行,不過須要用「\」進行轉義,根據Address的第二種狀況,咱們須要以「/RegExp/」進行過濾,因此最後的格式爲「/^\//p」
# sed -n '/^\//p' fstab---查詢並顯示以「/」斜線開頭的行
(1.7)對於Command部分,接着第三個參數是「a \string」,表示的是在指定的行後面追加新行,內容爲string。此時咱們發現以「^/」開頭的行的下一行都添加了一個新行「# hello world」(圖1-9),若是咱們但願可以添加兩行,則可使用「\n」做爲分隔符(圖1-10)。
# sed '/^\//a # hello world' fstab---在以「^/」開頭的行的末尾追加新行,追加的內容爲「# hello world」
# sed '/^\//a # hello world\n# hello Linux' fstab---在以「^/」開頭的行的末尾添加兩行,且以「\n」做爲分隔符
(1.8)對於Command部分,接着第四個參數是「i \string」,表示的是在指定的行前面添加新行,內容爲string。
# sed '/^\//i # hello world' fstab---在以「^/」開頭的行的上一行插入新行,追加的內容爲「# hello world」
(1.9)對於Command部分,接着第五個參數是「r FILE」,表示的是將指定的文件內容添加至符合條件的行處。咱們要求在fstab文件中,從第2行開始,將/etc/issue文件添加進來,此時即可以使用「2r /etc/issue」參數(圖1-12);若是咱們但願將/etc/issue文件添加到最後一行的後面,則可使用「$r /etc/issue」參數表示(圖1-13);若是咱們但願在指定的行,例如1至3行後面添加etc/issue文件,則可使用「1,3r /etc/issue」參數(圖1-14)。
# sed '2r /etc/issue' fstab---從第2行開始,將/etc/issue文件添加進來
# sed '$r /etc/issue' fstab---將/etc/issue文件添加到最後一行的後面
# sed '1,3r /etc/issue' fstab---設置從第1至第3行,每一行後面都添加/etc/issue文件
(1.10)對於Command部分,接着第六個參數是「w FILE」,表示將指定範圍內的內容另存至指定的文件中。例如咱們的需求是將fstab文件中有「oot」的行,提取出來保存至/tmp/oot.txt文件中,咱們使用「/oot/w /tmp/oot.txt」參數表示,此時咱們發如今/tmp/oot.txt文件中存儲的是fstab文件中含有oot的行。
# sed -n '/oot/w /tmp/oot.txt' fstab---將fstab文件中有「oot」的行,提取出來保存至/tmp/oot.txt文件中
# cat oot.txt---在/tmp目錄下查看oot.txt文件
(1.11)查找並替換
(1.11.1)對於Command部分,接着第七個參數是「s/pattern/string/」,表示的是查找並替換,默認只替換每行中第一次被模式匹配到的字符串。其中pattern處表示的能夠是字符串也能夠是正則表達式,而string處則只可使用字符串。咱們但願將fstab文件中含有oot的字符串替換爲OOT大寫的字符串,此時可使用「s/oot/OOT/」參數。
# sed 's/oot/OOT/' fstab---將fstab文件中含有oot的字符串替換爲OOT大寫的字符串
(1.11.2)若是咱們但願將fstab文件中以「/」開頭的行,將斜線替換爲「#」號,則可使用使用「s/^\//#/」參數,此時咱們發如今開頭兩行的「/」斜線已經被替換爲「#」號了。
# sed 's/^\//#/' fstab---將fstab文件中以「/」開頭的行,將斜線替換爲「#」號br/>![](https://s1.51cto.com/images/blog/201912/25/8447fbe61112b5852f7bce21d8aa5187.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
(1.11.3)若是咱們想要將fstab文件中的全部「/」斜線都替換爲「#」號,此時咱們應該使用全局替換符g,此時咱們發現系統中全部的斜線都被替換爲了「#」號(圖1-18)。若是咱們在查找替換的時候不想用「/」斜線做爲分隔符,也是可使用其餘特殊字符做爲分隔符的,例如「#」或者「@」等(圖1-19)。
g:全局替換
i:忽略字符大小寫
# sed 's/\//#/g' fstab---將fstab文件中的全部「/」斜線都替換爲「#」號
# sed 's@/@#@g' fstab---使用「@」做爲分隔符,並將fstab文件中的全部「/」斜線都替換爲「#」號
(1.12)替換表達式類型字符
(1.12.1)對於Command部分,接着第八個參數是「l..e」,例如將like轉換爲liker,將love轉換爲lover,此時咱們使用「&」符號,表明引用表達式部分的內容,而後在再加字母「r」表示替換爲咱們所但願的格式。
# sed 's#l..e#&r#g' sed.txt---使用「&」符號,表明引用表達式部分的內容,而後在再加字母「r」表示替換爲咱們所但願的格式
(1.12.2)若是咱們但願使用後項引用的方式來進行字符替換,則可使用以下的方式操做。咱們將like替換爲liker,咱們將love替換爲lover,使用後項引用的方式「s#(l..e)#\1r#g」參數來替換字符(圖1-21);若是咱們但願將like替換爲Like,將love替換爲Lover,則此時咱們只有使用後項引用的方式使用參數「s#l(..e)#L\1#g」,才能夠符合要求(圖1-22)。
# sed 's#(l..e)#\1r#g' sed.txt---將like替換爲liker,咱們將love替換爲lover
# sed 's#l(..e)#L\1#g' sed.txt---將like替換爲Like,將love替換爲Lover
(1.13)若是咱們但願修改原文件時,此時使用「sed -i」選項便可,直接修改原文件。若是咱們使用「sed -e」參數時,表示能夠同時執行多個腳本。固然咱們也能夠將多個腳本放在一個原文件中,而後使用「sed -f」能夠指定讀取這個原文件。最後咱們還可使用「sed -r」參數,表示使用擴展正則表達式。編輯器
(二)sed實戰演練
(2.1)示例:如今咱們的需求是將執行的history命令的行首的空白行清除掉,而且可以獲取到history命令的第一列的全部信息,此時咱們可使用「^[[:space:]]*」表示行首爲任意空格,而後再使用cut命令將打印結果的第一列顯示出來(圖1-25)。
# history | sed 's#^[[:space:]]*##g' | cut -d' ' -f1---執行的history命令的行首的空白行清除掉,而且可以獲取到history命令的第一列的全部信息
(2.2)示例:刪除/boot/grub2/grub.cfg文件中行首的空白符。
# sed -r 's@^[[:space:]]+@@g' /boot/grub2/grub.cfg---將/boot/grub2/grub.cfg文件中的行首的空白字符去除頂格顯示
(2.3)示例:替換/etc/inittab文件中「id:3:initdefault:」一行中的數字爲5。咱們將/etc/inittab文件拷貝到當前目錄,而後在最後一行添加一行「id:3:initdefault:」(圖2-4),此時咱們使用sed能夠獲得所需的結果。
# sed 's@(id:)[0-9](:initdefault:)@\15\2@g' inittab---將inittab文件中的最後一行「id:3:initdefault:」修改成「id:5:initdefault:」
(2.4)示例:刪除/etc/inittab文件中的空白行。
# cat /etc/inittab
# sed '/^$/d' /etc/inittab
(2.5)示例:刪除/etc/inittab文件中開頭的#號。
# sed 's@^#@@g' inittab
(2.6)示例:刪除某文件中開頭的#號及後面的空白字符,但要求#號後面必須有空白字符,#號後沒有空白字符的該#號不刪除。
# sed -r 's@^#[[:space:]]+@@g' /etc/inittab
(2.7)示例:先找出某文件中以空白字符開頭而且後面跟#號的行,而後刪除該行中的開頭的空白字符及#號。
# sed -r 's@^[[:space:]]+#@@g' /etc/inittab
(2.8)示例:取出一個文件或目錄路徑的父目錄名稱。首先咱們可能遇到的文件或目錄以下:「/etc/rc.d」、「/etc/rc.d/」、「/etc/rc.d/abc」、「/etc/rc.d/abc/」,而後取出文件或者目錄的父目錄並顯示出來。
# echo "/etc/rc.d/" | sed -r 's@^(/.*/)[^/]+/?@\1@g'---獲取目錄的父目錄
(2.9)示例:取出一個文件或目錄路徑的基名。首先咱們可能遇到的文件或目錄以下:「/etc/rc.d」、「/etc/rc.d/」、「/etc/rc.d/abc」、「/etc/rc.d/abc/」,而後取出文件或者目錄的基名例如rc.d或者abc顯示出來。
# echo "/etc/rc.d" | sed -r 's@^/.*/([^/]+)/?@\1@g'---顯示/etc/rc.d的基名ide
—————— 本文至此結束,感謝閱讀 ——————工具