grep、sed和awk在Linux/Unix系統中並稱爲文本處理三劍客(結合正則表達式使用);正則表達式
1、什麼是sed? shell
sed是非交互式文本編輯器,它能夠對文本文件和標準輸入進行編輯,標準輸入能夠是來自鍵盤輸入、文件重定向、字符串、變量,甚至來自管道的文本。它是流式編輯器。vim
2、sed的工做過程:app
sed從文本的一個文本行或標準輸入中讀取數據,將其複製到緩衝區,而後讀取命令行或腳本的第一個命令,對此命令要求的行號進行編輯,重複此過程,直到命令行或腳本中的全部命令執行完畢。
編輯器
3、特色:ide
相對於其餘的文本編輯sed具有如下讓人難以拒絕的特色;函數
一、 非交互式,基於模式匹配的過濾及修改文本。spa
二、逐行處理,因此對溫馨的交互式編輯而言太大的文件使用sed會顯得 十分高效
命令行
,爲用戶節省了大量的時間。orm
三、可實現對文本的輸出、刪除、替換、複製、剪切、導入、導出等各類編輯操做。
四、腳本化,在shell腳本編輯中vim須要通知處理文件的哪幾行纔會去處理,而sed默認會處理文件的全部行。
五、sed只對緩衝區(模式空間)中原始文件的副本進行編輯,不編輯原文件。若是要把編輯後的內容保存,能夠將輸出重定向輸出到另外一個文件。
4、sed適用於如下三種場合
一、編輯相對交互式文件編輯器而言太大的文件
二、編輯命令太複雜,在交互式文本編輯器中難以輸入的狀況
三、對文件掃描一遍,可是須要執行多個編輯函數的狀況
5、sed 相關使用詳解:
一、語法格式:sed [OPTION]... {script-only-if-no-other-script} [input-file]...
OPTION----選項
script-----地址定界編輯命令
input-file----輸入文件
二、選項[OPTION]:
(1)、經常使用選項:
-n:不輸出(模式空間)中的內容到標準輸出(顯示屏);
sed -n '1p' input
-e:多點編輯(-e script),表示將下一個字符串解析爲sed編輯命令。若是隻傳送一個命令給sed時,-e 能夠省略;
sed -e '1p/p' -e '1p/=’input
-f:表示正在調用sed腳本文件(-f /PATH/TO/SED_SCRIPT_FILE),每行一個編輯命令。
例如:腳本append.sed腳本演示sed追加文本方法
#!/bin/sed -f
/file:/a\ a\表示此處換行添加文本
-r:從文本中讀取文本,支持擴展正則表達式;
echo 「aa bb」 | sed -r 's/(.)/a/' 若是不加-r時,後面的()符號要轉義
-i:在定位行號以前直接編輯原文件。
sed -i 's/inn/out/g' test.txt
(2)、地址定界:
sed命令一般由定位文本行和sed編輯命令兩部分組成;
使用行號,指定一行,或指定行號範圍
使用正則表達式
1)、空地址:對全文進行處理
2)、單地址:
x:表明指定行號;
/pattern/:查看包含模式的行,或此模式匹配到的行
3)、地址範圍:
x,y:指定x到y的行號範圍內
x,+y:指定x,到後面y行範圍
x,/pattern/:從x號行到與/pattern/的匹配行之間的行
/patter/pattern/:查詢包含兩個模式的行
$:最後一行
4)、步進:~
1~2:匹配全部奇數行
2~2:匹配全部的偶數行
(3)、地址定界:
d:刪除,刪除所匹配到的行(後面通常不接什麼)
p:列印,顯示模式空間中的內容(一般與sed -n 一塊兒出現)
a\text:新增,text爲字串,這些字串會在新增到下一行出現
i\text :插入,text爲字串,這些字串會在新增到上一行出現
c\text:替換 ,text爲字串 ,這些字串能夠取代n1,n2之間的行
s///:查找替換,能夠直接進行替換,一般結合正則表達式 法,
其分隔符可自行指定,經常使用的有s@@@, s###等
g:全局替換;
w /PATH/TO/SOMEFILE:將替換成功的結果保存至指定文件中;
p:顯示替換成功的行;
6、sed 實例:
舉例:(假設咱們有一文件名爲ab)
刪除某行
[root@localhost gayj] # sed '1d' ab #刪除第一行
[root@localhost gayj] # sed '$d' ab #刪除最後一行
[root@localhost gayj] # sed '1,2d' ab #刪除第一行到第二行
[root@localhost gayj] # sed '2,$d' ab #刪除第二行到最後一行
顯示某行
[root@localhost gayj] # sed -n '1p' ab #顯示第一行
[root@localhost gayj] # sed -n '$p' ab #顯示最後一行
[root@localhost gayj] # sed -n '1,2p' ab #顯示第一行到第二行
[root@localhost gayj] # sed -n '2,$p' ab #顯示第二行到最後一行
使用模式進行查詢
[root@localhost gayj] # sed -n '/gayj/p' ab #查詢包括關鍵字gayj所在全部行
[root@localhost gayj] # sed -n '/\$/p' ab #查詢包括關鍵字$所在全部行,使用反斜線\屏蔽特殊含義
增長一行或多行字符串
[root@localhost gayj]# cat ab
Hello!
gayj is me,welcome to my blog.
end
[root@localhost gayj] # sed '1a drink tea' ab #第一行後增長字符串"drink tea"
Hello!
drink tea
gayj is me,welcome to my blog.
end
[root@localhost gayj] # sed '1,3a drink tea' ab #第一行到第三行後增長字符串"drink tea"
Hello!
drink tea
gayj is me,welcome to my blog.
drink tea
end
drink tea
[root@localhost gayj] # sed '1a drink tea\nor coffee' ab #第一行後增長多行,使用換行符\n
Hello!
drink tea
or coffee
gayj is me,welcome to my blog.
end
代替一行或多行
[root@localhost gayj] # sed '1c Hi' ab #第一行代替爲Hi
Hi
gayj is me,welcome to my blog.
end
[root@localhost gayj] # sed '1,2c Hi' ab #第一行到第二行代替爲Hi
Hi
end
替換一行中的某部分
格式:sed 's/要替換的字符串/新的字符串/g' (要替換的字符串能夠用正則表達式)
[root@localhost gayj] # sed -n '/gayj/p' ab | sed 's/gayj/bird/g' #替換gayj爲bird
[root@localhost gayj] # sed -n '/gayj/p' ab | sed 's/gayj//g' #刪除gayj
插入
[root@localhost gayj] # sed -i '$a bye' ab #在文件ab中最後一行直接輸入"bye"
[root@localhost gayj]# cat ab
Hello!
gayj is me,welcome to my blog.
end
bye
刪除匹配行
sed -i '/匹配字符串/d' filename (注:若匹配字符串是變量,則須要「」,而不是‘’。記得好像是)
替換匹配行中的某個字符串
sed -i '/匹配字符串/s/替換源字符串/替換目標字符串/g' filename