sed命令基本用法正則表達式
sed是一個非交互式文本編輯器,它能夠對文本文件和標準輸入進行編輯,標準輸入能夠是來自鍵盤輸入、文件重定向、字符串、變量、來自管道的文本等等。shell
sed從文本的一個文本行或標準輸入中讀取數據,將其複製到緩存區,而後讀取命令行或腳本的第一個命令,對此命令要求的行號進行編輯,重複此過程,直到命令行或腳本中全部命令都執行完了。sed能夠一次性處理全部的編輯命令,很是高效緩存
sed適用於下面三種場合:app
* 編輯相對於交互式文本編輯器而言太大的場合編輯器
* 編輯命令太複雜,在交互式文本編輯器中難以輸入的狀況函數
* 對文件掃描一遍,可是須要執行多個編輯函數的狀況this
sed只是對緩存區中原始文件的副本進行編輯,並不編輯原始文件。所以,若是須要保存更改內容,須要將輸出重定向到另外一個文件,可使用下面的命令:spa
sed 'sed命令' input_file > result_file命令行
或者還有另外一種方法就是 -w 選項,這個後面講到code
有三種方式調用sed:
① 直接在shell命令行上調用
# sed [選項] 'sed命令' 輸入文件
② 將sed命令插入腳本文件後,經過sed命令調用腳本:
# sed [選項] -f sed腳本文件名 輸入文件
③ 將sed命令寫入腳本文件後,將其+x變成可執行
./sed腳本文件 輸入文件
第三種方式須要在文件頭部加上 #!/bin/sed
sed命令的經常使用選項:
-n 不打印全部行到標準輸出
-e 表示將下一個字符串解析爲sed編輯命令,若是隻傳遞一個編輯命令,-e能夠省略
-f 表示正在調用sed腳本文件
sed命令一般由定位文本行和sed編輯命令兩部分組成,sed編輯命令對定位到的行進行各類編輯處理
sed提供兩種方式定位文本行:
* 使用行號,指定一行或者行號範圍
* 使用正則表達式
sed命令定位文本行的方法:
選項 | 意義 |
x | x爲指定行號 |
x,y | 指定從x到y的行號範圍 |
/pattern/ | 查詢包含模式的行 |
/pattern/pattern/ | 查詢包含兩個模式的行 |
/pattern/,x | 從與pattern的匹配行到x號行之間的行 |
x,/pattern/ | 從x號行到與pattern的匹配行之間的行 |
x,y! | 查詢不包含x和y行號的行 |
===================================分割線=======================
sed編輯命令表
選項 | 意義 |
p | 打印匹配行 |
= | 打印匹配行號 |
a\ | 在定位行以後追加文本信息 |
i\ | 在定位行以前插入文本信息 |
d | 刪除定位行 |
c\ | 用新文本替換定位行 |
s | 使用替換模式替換相應的模式 |
r | 從另外一個文件中讀文本 |
w | 將文本寫入到另外一個文件中 |
y | 變換字符 |
q | 第一個模式匹配完成後退出 |
l | 顯示與八進制ASCII碼等價的控制字符 |
{} | 在定位行執行的命令組 |
n | 讀取下一個輸入行,用下一個命令處理新的行 |
h | 將模式緩存區的文本複製到保持緩存區 |
H | 將模式緩存區的文本追加到保持緩存區 |
x | 互換模式緩存區和保持緩存區的內容 |
g | 將保持緩存區的內容複製到模式緩存區 |
G | 將保持緩存區的內容追加到模式緩存區 |
========================分割線============================
各個選項和編輯命令詳解:
1,sed命令的-n選項和p命令
# sed -n '1p' input
# sed '1p' input
從輸出能夠看出,加了-n後標準輸出上只有第一行打印出來了,而不加-n時候,先打印第一行,而後打印整個文件內容。因此-n選項的意義是:不打印sed編輯內容也就是input的所有內容。只打印匹配的行
# sed -n '3,6p' input --> 打印從3到6行
# sed -n '/certificate/p' input --> 打印匹配模式行,注意大小寫是敏感的
2,sed命令的-e選項
因爲sed不支持同時帶多個編輯命令的用法,所以須要用-e選項指定每一個編輯命令
# sed -n -e '/Certificate/p' -e '/Certificate/=' input
3,sed命令的-f選項
-f選項只有調用sed腳本文件時才起做用,追加文本、插入文本、修改文本、刪除文本和替換文本等功能每每須要幾條sed命令才能完成,因此,每每將這些命令寫入sed腳本,而後調用sed腳原本完成。
下面是這個sed的腳本:
注:上面的/file:/a\中的\表示在換新行後添加內容,而下面內容中的\也表示換行。
4.2.2 sed文本定位的一組例子
1. 匹配元字符
若是目標字符串中包含元字符,須要使用轉義符\屏蔽其特殊意義。
# sed -n '/\./p' input --> 打印含有.的行
2. 使用元字符進行匹配
sed能夠靈活使用正則表達式的元字符進行匹配,不過注意的是:$在正則表達式中表示行尾,可是在sed命令中卻表示最後一行,而寫在//中間的$就表示行尾了,哈哈。
# sed -n '$p' input --> 打印最後一行
# sed -n '/^$/p' input -> 打印空行
3. !符號
!表示取反,也就是不知足條件的時候就處理
# sed -n '/.*this/!p' input --> 打印不包含this的行
# sed -n '3,6!p' input --> 打印不在3至6行間的行
4.2.3 sed基本編輯命令的一組例子
1. 插入文本
插入文本和追加文本相似,區別僅僅是追加文本是在匹配行的後面插入,而插入文本是在匹配行的前面插入
sed插入文本符號位i\,插入文本的格式爲:
sed '指定地址 i\text' 輸入文件
新建名爲insert.sed的腳本,內容以下:
2. 修改文本
修改文本是指將所匹配的問本行用新文本代替,也就是隻能整行替換,sed修改文本符號位c\
sed '指定行 c\text' 輸入文件
3. 刪除文本
sed刪除文本命令能夠將指定行或指定行範圍進行刪除,sed的刪除文本符號爲d
sed '指定行 d' 輸入文件
4.替換文本
sed替換文本將所匹配的文本行中找到的字符串用新的字符串去代替,經常使用。而上面的修改文本只能整行,sed替換文本符號爲s
sed -n 's/被替換的字符串/新的字符串/p' --> 只替換每行中第一次找到的
sed -n 's/被替換的字符串/新的字符串/gp' --> 替換每行中全部找到的
sed -n 's/被替換的字符串/新的字符串/np' --> 替換每行中第n次找到的
sed替換文本中有個重要的符號&,它表示保存被替換的字符串以供調用。
好比下面兩條命令等級:(都是將this字符串用括號括起來)
# sed -n 's/this/(&)/gp' input
# sed -n 's/this/(this)/gp' input
5. 寫入到一個新文件
上面提到的都是對緩存區中輸入文件的複製內容進行編輯,若是要保存編輯結果,須要將編輯後的文本重定向到另外一個文件,sed寫入文件符號爲w,基本格式爲:
# sed -n '1,5 w output' input
# sed -n '/this/2 output' input
# sed -n 's/this/(&)/gw output' input --> 將this加上括號後,匹配行寫入到output中去
注:這裏寫到新文件中的只有匹配的行修改後的數據,若是要整個文件內容都寫進去,使用重定向>> 或者>
6. 從文件中讀入文本內容
sed命令還能夠將其餘文件中的內容讀入,並附加在指定地址後,sed讀入文件的符號爲r
# sed '/this/r otherfile' input
7. 退出命令
sed命令的q選項表示完成指定地址匹配後當即退出
# sed -n '/this/p' input --> 打印出匹配的所有字符串
# sed -n -e '/this/p' -e '/this/q' test.txt --> 找到第一個匹配的打印後就當即退出
8. 變換命令
sed命令的y選項表示字符變換,它將一系列的字符變換爲相應的字符,逐個處理的
# sed 'y/被變換的字符序列/變換的字符序列/' 輸入文件
# sed 'y/12345/ABCDE' input --> 將input中1變成A,2變成B,3變成C,4變成D,5變成E
9. 顯示控制字符
sed 1命令能夠顯示出文件中的控制字符,好比退格鍵、F1鍵、Shift鍵等
# sed -n '1,$1' input
10. 在定位行執行命令組
sed編輯命令中的{}能夠指定在定位行上所執行的命令組,它的做用與sed的-e選項相似,都是爲了在定位行執行多個編輯命令。
下面的命令等價:
# sed -n -e '/this/p' -e '/this/q' test.txt
# sed -n '/this/{p;q}' test.txt -->顯然這個更NB點
4.2.4 sed高級編輯命令的一組例子
1. 處理匹配行的下一行
sed編輯命令n的意義是讀取下一個輸入行,用n後面的一個命令處理該行,因爲此時一般有個多個編輯命令,因此命令n須要與{}配合使用
# sed '/this is/{n;s/her/him/;}' input --> 找到this is關鍵詞那行,而後將它下一行的her替換成him
2. sed緩存區的處理
前面提到的全部編輯命令都是將輸入文件複製到緩存區,對緩存區的複製內容進行處理。實際上,sed有兩個緩存區,模式緩存區 Pattern Buffer 和保持緩存區 Hold Buffer。前面都是Pattern Buffer,而保持緩存區是另外一個內存空間,sed的一些編輯命令能夠對保持緩存區進行處理,並與模式緩存區的內容互換
# sed h、x、G命令的用法
# sed '/subject/h; /object/x; $G' input
解釋下:
第一個h命令是將模式緩存區內容複製到保持緩存區,也就是說當找到subject的行的時候,就將該行復制到Hold Buffer,若是該行有object關鍵詞就將模式緩存區和保持緩存內容互換後輸出模式緩存區內容,第三條命令表示若是是到了最後一行,就直接輸出保持緩存區內容。
h和H、g和G是兩組對應的命令
h和H命令是將模式緩存區內容替換掉保持緩存區內容,不過h是副本,即將保持緩存區的就內容覆蓋掉,而H是追加,即在保持緩存區內容上增長新的內容
g和G是將保持緩存區內容替換掉模式緩存區內容,一樣,g是副本、G是追加。
3.利用分號;分割多個編輯命令,這個比起-e選項更NB一點。^_^
# sed '/subject/h; /object/x; $G' input