sed是一種在線編輯器,它一次處理一行內容。處理時,把當前處理的行存儲在臨時緩衝區中,稱爲「模式空間」(pattern space),接着用sed命令處理緩衝區中的內容,處理完成後,把緩衝區的內容送往屏幕。接着處理下一行,這樣不斷重複,直到文件末尾。文件內容並無改變,除非你使用重定向存儲輸出或者加入i參數。Sed主要用來自動編輯一個或多個文件;簡化對文件的反覆操做;編寫轉換程序等。linux
小結:sed的功能是,對字符串進行增長、刪除、改變、查找,即增刪改查!正則表達式
sed [optian] [sed-command] [input-file]shell
注意sed和後面的選項之間至少有一個空格。bash
爲了不混淆,稱呼sed爲sed軟件。sed-commands(sed命令)是sed軟件內置的一些命令選項,爲了和前面的options(選項)區分,故稱爲sed命令。編輯器
sed-commands既能夠是單個sed命令,也能夠是多個sed命令組合。ide
input-file(輸入文件)是可選項,sed還可以從標準輸入如管道獲取輸入。測試
測試文本內容爲:spa
[root@lixin ~]# cat oldboy.txt I am oldboy teacher! I teach linux. I like badminton ball ,billiard ball and chinesechess! my blog is http://oldboy.blog.51cto.com our site is http://www.etiantian.org my qq num is 49000448. not 4900000448. my god ,i am not oldbey,but OLDBOY! gd good gooood [root@lixin ~]#
-n:表示取消標準輸出(默認狀況下sed替換後會把文件全部內容包括更改過的內容一塊兒輸出到屏幕上,咱們使用-n後,讓它只輸出匹配表達式的字符串,通常和p連用,p表示print,打印表達式結果)。3d
[root@lixin ~]# sed '/old/p' oldboy.txt I am oldboy teacher! I am oldboy teacher! I teach linux. I like badminton ball ,billiard ball and chinesechess! my blog is http://oldboy.blog.51cto.com my blog is http://oldboy.blog.51cto.com our site is http://www.etiantian.org my qq num is 49000448. not4900000448. my god ,iam not oldbey,but OLDBOY! my god ,iam not oldbey,but OLDBOY! gd good gooood [root@lixin~]# sed -n '/old/p' oldboy.txt I amoldboy teacher! my blogis http://oldboy.blog.51cto.com my god ,iam not oldbey,but OLDBOY! [root@lixin~]# //-n和p連用後表示只打印符合表達式規則的行
-r:參數用來支持擴展正則表達式,好比{}符號,若是不加-r參數須要使用\來進行轉意。orm
[root@lixin ~]# sed -n '/o\{1,2\}/p' oldboy.txt I am oldboy teacher! I like badminton ball ,billiard ball and chinesechess! my blog is http://oldboy.blog.51cto.com our site is http://www.etiantian.org not 4900000448. my god ,i am not oldbey,but OLDBOY! good gooood [root@lixin ~]# sed -nr '/o{1,2}/p' oldboy.txt I am oldboy teacher! I like badminton ball ,billiard ball and chinesechess! my blog is http://oldboy.blog.51cto.com our site is http://www.etiantian.org not 4900000448. my god ,i am not oldbey,but OLDBOY! good gooood [root@lixin ~]# //表達式含義:o最少重複1次,最多重複2次
-i:表示直接對目標文件進行操做(增刪改查),加上這個參數以後,不會在屏幕上輸出信息,會直接對源文件進行更改(慎用)。
[root@lixin ~]# sed -i '/^$/d' oldboy.txt //直接刪除文件內的空行,並無打印。 [root@lixin ~]# cat oldboy.txt I am oldboy teacher! I teach linux. I like badminton ball ,billiard ball and chinesechess! my blog is http://oldboy.blog.51cto.com our site is http://www.etiantian.org my qq num is 49000448. not 4900000448. my god ,i am not oldbey,but OLDBOY! gd good gooood [root@lixin ~]#
測試文本內容爲:
[root@lixin ~]# cat study.txt 1,I am a Linux student 2,I am studying Linux 3,I like movice 4,I am super man 5,I like computer games [root@lixin ~]#
-i:表示插入,插入到目標行以前。
[root@lixin ~]# sed '2i she is a girl' study.txt 1,I am a Linux student she is a girl 2,I am studying Linux 3,I like movice 4,I am super man 5,I like computer games [root@lixin ~]# //2i表示在第二行插入,不加行號表示在每一行以前插入
-a:表示在目標行以後添加
[root@lixin ~]# sed '3a he is a boy' study.txt 1,I am a Linux student 2,I am studying Linux 3,I like movice he is a boy 4,I am super man 5,I like computer games [root@lixin ~]#
多行增長
方法一:利用\n,表示換行符
[root@lixin ~]# sed '2i 1\n2\n3' study.txt 1,I am a Linux student 1 2 3 2,I am studying Linux 3,I like movice 4,I am super man 5,I like computer games [root@lixin ~]#
方法二:利用shell特性(\回車)表示接着下一行。
[root@lixin ~]# sed '2i 1\ > 2\ > 3 ' study.txt 1,I am a Linux student 1 2 3 2,I am studying Linux 3,I like movice 4,I am super man 5,I like computer games [root@lixin ~]#
sed軟件能夠對單行或多行進行處理。若是在sed命令前面不指定地址範圍,那麼默認會匹配全部行。
用法:
n1[,n2]{sed-commands}
注:地址用逗號分隔的,n1,n2能夠用數字、正則表達式、或兩者的組合表示。
例子:
n{sed-commands} 對第n行操做。
[root@lixin ~]# sed '5c she is a girl ' study.txt 1,I am a Linux student 2,I am studying Linux 3,I like movice 4,I am super man she is a girl [root@lixin ~]# //表示針對第武行進行替換,替換爲she isa girl
n,m{sed-commands} 對n到m行操做,包括第n,m行。
[root@lixin ~]# sed '2,4c she is a girl ' study.txt 1,I am a Linux student she is a girl 5,I like computer games [root@lixin ~]# //表示把2到4行替換成she is a girl。
n,+m{sed-commands} 對n到n+m行操做,包括第n,m行
[root@lixin ~]# sed '2,3d' study.txt 1,I am a Linux student 4,I am super man 5,I like computer games [root@lixin ~]# //表示2到3行刪除
1~2{sed-commands} 對1,3,5,7,……行操做
[root@lixin ~]# sed '2~2d' study.txt 1,I am a Linux student 3,I like movice 5,I like computer games [root@lixin ~]# //表示對2,4,6,8等偶數行進行操做
n,${sed-commands} 對n到最後一行($表明最後一行)操做,包括第n行
[root@lixin ~]# sed '2,$d' study.txt 1,I am a Linux student [root@lixin ~]# //刪除2行到$(尾行)
/Linux/{sed-commands} 對匹配oldboy的行操做
[root@lixin ~]# sed '/Linux/d' study.txt 3,I like movice 4,I am super man 5,I like computer games [root@lixin ~]# //表示把包涵Linux的行刪掉
/Linux/,/movice/{sed-commands} 對匹配oldboy的行到匹配Alex的行操做
[root@lixin ~]# sed '/Linux/,/movice/d'study.txt 4,I am super man 5,I like computer games [root@lixin ~]# //表示把第一個包涵Linux到第一個包涵movice的行刪掉
/movice/,${sed-commands} 對匹配oldboy的行到最後一行操做
[root@lixin ~]# sed '/movice/,$d' study.txt 1,I am a Linux student 2,I am studying Linux [root@lixin ~]# //表示從movice到最後一行刪掉
/games/,10{sed-commands} 對匹配oldboy的行到第10行操做,注意:若是前10行沒有匹配到oldboy,sed軟件會顯示10行之後的匹配oldboy的全部行,若是有。
[root@lixin ~]# sed '/games/,4d' study.txt 1,I am a Linux student 2,I am studying Linux 3,I like movice 4,I am super man [root@lixin ~]#
1,/am/{sed-commands} 對第1行到匹配Alex的行操做
[root@lixin ~]# sed '1,/am/d' study.txt 3,I like movice 4,I am super man 5,I like computer games [root@lixin ~]# //表示從1行到第一個匹配到am的行刪除
/student/,+2{sed-commands} 對匹配oldboy的行到其後的2行操做
[root@lixin ~]# sed '/student/,+2d' study.txt 4,I am super man 5,I like computer games [root@lixin ~]# //表示從匹配student的第一項到它的後兩行進行刪除
-d:表示刪除,能夠直接刪除行,能夠刪除包涵關鍵字的行
[root@lixin ~]# sed '2d' study.txt 1,I am a Linux student 3,I like movice 4,I am super man 5,I like computer games games //刪除第2行 [root@lixin ~]# sed '/am/d' study.txt 3,I like movice [root@lixin ~]# //刪除包涵am的行
p表示打印,把符合咱們表達式的項目打印出來,因爲sed默認輸出全部,再使用拍的話會打印兩遍,因此通常和-n參數連用,表示只打印匹配到的行。
[root@lixin ~]# sed '/am/p' study.txt //因爲沒有-n因此會把匹配到的行和默認輸出一塊兒打印 1,I am a Linux student 1,I am a Linux student 2,I am studying Linux 2,I am studying Linux 3,I like movice 4,I am super man 4,I am super man 5,I like computer games 5,I like computer games games games [root@lixin ~]# sed -n '/am/p' study.txt //-n取消默認輸出,p打印,因此只顯示匹配項 1,I am a Linux student 2,I am studying Linux 4,I am super man 5,I like computer games games [root@lixin ~]# [root@lixin ~]# sed -n '2p' study.txt 2,I am studying Linux [root@lixin ~]# //只顯示第二行
-c:按行替換,表示一次替換一整行的內容。
[root@lixin ~]# sed '1c she is a girl' study.txt she is a girl 2,I am studying Linux 3,I like movice 4,I am super man 5,I like computer games games [root@lixin ~]# //表示把第1行,替換成she is a girl
s:表示全局查找某個關鍵字,並替換每行第一個匹配項。
g:表示全局替換,不屬於sed命令,通常搭配s使用。
格式:
sed ‘s#1#2#g’
#:表示定界符,能夠是/、@、或者其餘成對符號。
1:表示要替換的源文件中的字符串(能夠是正則表達式)。
2:表示要替換成的文件,必須是給定的字符串。
文本替換實例:
[root@lixin~]# !ca cat study.txt 1,I am a Linux student 2,I am studying Linux 3,I like movice 4,I am super man 5,I like computer games [root@lixin ~]# sed '1s#a#b#' study.txt //把第一個a替換爲b 1,I bm a Linux student 2,I am studying Linux 3,I like movice 4,I am super man 5,I like computer games [root@lixin ~]# [root@lixin ~]# sed '1s#a#b#g' study.txt //把第一行全部a替換爲b 1,I bm b Linux student 2,I am studying Linux 3,I like movice 4,I am super man 5,I like computer games [root@lixin ~]#
變量替換實例:
[root@lixin ~]# n=a //設定變量n的值爲a [root@lixin ~]# m=c //設定變量m的值爲c [root@lixin ~]# echo $n //驗證變量n的值 a [root@lixin ~]# echo $m //驗證變量b的值 c [root@lixin ~]# sed '1s#$n#$m#g' study.txt //因爲’’單引號,不解釋內部變量值因此沒有替換 1,I am a Linux student 2,I am studying Linux 3,I like movice 4,I am super man 5,I like computer games [root@lixin ~]# sed "1s#$n#$m#g"study.txt // 「」 雙引號表示引用內部的變量,因此替換了 1,I cm c Linux student 2,I am studying Linux 3,I like movice 4,I am super man 5,I like computer games [root@lixin ~]# //表示能夠利用變量的值來對字符串進行過濾或替換(必須用」」雙引號)
sed軟件的( )的功能能夠記住正則表達式的一部分,其中,\1爲第一個記住的模式即第一個小括號中的匹配內容,\2第二記住的模式,即第二個小括號中的匹配內容,sed最多能夠記住9個。這種在後面調用的方式,叫作後向引用。
格式:
sed ‘s#()()#\1\2#g’
第一個()表示第一項,第二個()表示第二項,一次類推,最多九個,不想匹配的能夠寫在括號後面。
\1表示引用前面第一個()括號內的內容,\2表示引用前面第二個()括號內的內容。
實例:
獲取ip地址信息
[root@lixin ~]# ifconfig eth0 eth0 Link encap:Ethernet HWaddr00:0C:29:E4:83:06 inet addr:10.0.0.8 Bcast:10.0.0.255 Mask:255.255.255.0 inet6 addr: fe80::20c:29ff:fee4:8306/64 Scope:Link UPBROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RXpackets:981 errors:0 dropped:0 overruns:0 frame:0 TXpackets:562 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RXbytes:85039 (83.0 KiB) TX bytes:62853(61.3 KiB) [root@lixin ~]# ifconfig eth0 | sed -nr'2s#^.*r:(.*).?B.*$#\1#gp' 10.0.0.8 [root@lixin ~]# // ^.*r: 表示以任意字符開頭到r:爲止。 //(.*) 表示任意字符,這裏就是咱們要取得ip信息。 //.?B.*$ ,.?表示匹配任意兩個字符,B.*$表示從B到結尾。
特殊符號的使用:
批量進行文件後綴名更改
[root@lixin lixin]# ls LinuxAdministartor10.bak LinuxAdministartor2.bak LinuxAdministartor4.bak LinuxAdministartor6.bak LinuxAdministartor8.bak LinuxAdministartor1.bak LinuxAdministartor3.bak LinuxAdministartor5.bak LinuxAdministartor7.bak LinuxAdministartor9.bak [root@lixin lixin]# ls | sed -nr's#(^L.*[0-9])(.*$)#mv & \1.txt#gp' mv LinuxAdministartor10.bakLinuxAdministartor10.txt mv LinuxAdministartor1.bak LinuxAdministartor1.txt mv LinuxAdministartor2.bak LinuxAdministartor2.txt mv LinuxAdministartor3.bak LinuxAdministartor3.txt mv LinuxAdministartor4.bak LinuxAdministartor4.txt mv LinuxAdministartor5.bak LinuxAdministartor5.txt mv LinuxAdministartor6.bak LinuxAdministartor6.txt mv LinuxAdministartor7.bak LinuxAdministartor7.txt mv LinuxAdministartor8.bak LinuxAdministartor8.txt mv LinuxAdministartor9.bak LinuxAdministartor9.txt [root@lixin lixin]# ls | sed -nr's#(^L.*[0-9])(.*$)#mv & \1.txt#gp' | bash [root@lixin lixin]# ls LinuxAdministartor10.txt LinuxAdministartor2.txt LinuxAdministartor4.txt LinuxAdministartor6.txt LinuxAdministartor8.txt LinuxAdministartor1.txt LinuxAdministartor3.txt LinuxAdministartor5.txt LinuxAdministartor7.txt LinuxAdministartor9.txt [root@lixin lixin]# // &符號表示前面兩個分隔符中間的全部內容 //shell的命令都是bash在執行,因此把命令拼出來後直接交給bash處理便可