Shell:sed工具
簡介
sed (stream editor, 流編輯器) 是Linux下一款功能強大的非互動流式文字編輯器(vim是互動式文字編輯器),可以對文字檔案的每一行資料匹配查詢之後進行增、刪、改、查等操作,支援按行、按欄位、按正則匹配文字內容,靈活方便,特別適合於大檔案的編輯.
sed是一種流編輯器,它一次處理一行內容, 將這行放入快取(存區空間稱為:模式空間),然後才對這行進行處理,處理完後,將快取區的內容傳送到終端。
sed處理資料原理:
語法
sed [選項引數] [模式匹配/sed程式命令] [檔名] # 模式匹配,sed會讀取每一行資料到模式空間中, 之後判斷當前行是否符合模式匹配要求,符合要求就會 # 執行sed程式命令, 否則不會執行sed程式命令;如果不寫匹配模式,那麼每一行都會執行sex程式命令
選項引數說明:
選項引數 | 功能 |
---|---|
-e |
直接在指令列模式上進行sed的動作編輯。它告訴sed將下一個引數解釋為一個sed指令,只有當命令列上給出多個sed指令時才需要使用-e選項;一行命令語句可以執行多條sed命令 |
-i |
直接對內容進行修改,不加-i時預設只是預覽,不會對檔案做實際修改 |
-f |
後跟儲存了sed指令的檔案(儲存到其他檔案輸出) |
-n |
取消預設輸出,sed預設會輸出所有文字內容,使用-n引數後只顯示處理過的行 |
-r ruguler |
使用擴充套件正則表示式,預設情況sed只識別基本正則表示式 * |
sed程式命令功能描述:
命令 | 功能描述 |
---|---|
a |
add新增,a的後面可以接字串,在下一行出現 |
c |
change更改, 更改匹配行的內容 |
d |
delete刪除, 刪除匹配的內容 |
i |
insert插入, 向匹配行前插入內容 |
p |
print列印, 打印出匹配的內容,通常與-n選項和用 |
s |
substitute替換, 替換掉匹配的內容 |
= |
用來列印被匹配的行的行號 |
n |
讀取下一行,遇到n時會自動跳入下一行 |
特殊符號
命令 | 功能描述 |
---|---|
! |
就像一個sed命令,放在限制條件後面, 對指定行以外的所有行應用命令(取反) |
{sed命令1;sed命令2} | 多個命令操作同一個的行 |
實戰
準備資料:
vi sed.txt
QWE
shanghai shanghai
nanjing
1234
nanjing
向檔案新增資料
在第三行後面新增資料
sed -i '3ahello' sed.txt
在第三行前面新增資料
sed -i '3ihello' sed.txt
在指定內容前後新增資料:在shanghai字串後面插入hi
sed -i '/shanghai/ahi' sed.txt
在最後一行後新增資料:
sed -i '$ahaha' sed.txt
刪除檔案中的資料
刪除第三行資料:
sed -i '3d' sed.txt
刪除奇數行:
#從第一行開始刪除,每隔兩行就刪掉一行
#不加選項引數-i,只預覽結果不修改檔案
sed '1~2d' sed.txt
刪除指定範圍多行資料
#刪除1到3行
sed '1,3d' sed.txt
刪除不在指定範圍的多行資料
#刪除不在1,3行的資料
sed '1,3!d' sed.txt
刪除最後一行
sed '$d' sed.txt
刪除匹配內容的行
#刪除含有hello的行
sed '/hello/d' sed.txt
刪除匹配行及其後面一行
sed '/hello/,+1d' sed.txt
刪除不匹配行
#刪除不匹配shanghai或nanjing的行
sed '/shanghai\|nanjing/!d' sed.txt
更改檔案資料
更改第一行
#更改第一行為hello
sed '1chello' sed.txt
將包含shanghai的行修改為beijing
sed '/shanghai/cbeijing' sed.txt
將最後一行修改為hello
sed '$chello' sed.txt
將檔案中每行第一個shanghai替換為beijing
sed 's/shanghai/beijing/' sed.txt
全域性匹配替換shanghai為beijing
sed 's/shanghai/beijing/g' sed.txt
將檔案中每行第二個shanghai替換為beijing
sed 's/shanghai/beijing/2' sed.txt
將每行中第二個匹配的shanghai替換為beijing , 將替換後的內容寫入到sed2.txt檔案中
# 第一種方式
sed -n 's/shanghai/beijing/2pw sed2.txt' sed.txt
# w寫入
# p列印, -n只是獲取匹配的行
# 第二種方式
sed -n 's/shanghai/beijing/2p ' sed.txt > sed2.txt
正則表示式匹配替換:
#匹配有 `i` 的行,替換匹配行中 `h` 後的所有內容為空
sed '/i/s/h.*//' sed.txt
每行末尾拼接 java
sed 's/$/& java/' sed.txt
每行行首新增#
sed 's/^/&#/' sed.txt
查詢
查詢含有shanghai的行
sed -n '/shanghai/p' sed.txt
多個sed執行:將sed.txt檔案中的第1行刪除並將 shanghai
替換為 baijing
# 第一種方式, 多個sed程式命令 在每個命令之前使用 -e 引數
sed -e '1d' -e 's/shanghai/beijing/g' sed.txt
# 第二種方式
sed '1d;s/shanghai/beijing/g' sed.txt
sed高階用法:快取去資料交換
模式空間與暫存空間介紹
-
首先需要明白, sed處理檔案是逐行處理的, 即讀取一行處理一行,輸出一行;
-
sed把檔案讀出來每一行存放的空間叫模式空間, 會在該空間中對讀到的內容做相應處理;
-
此外sed還有一個額外的空間即暫存空間, 暫存空間剛開始裡邊只有個空行, 記住這一點;
-
sed可使用相應的命令從模式空間往暫存空間放入內容或從暫存空間取內容放入模式空間;
2個快取空間傳輸資料的目的是為了更好的處理資料。
關於快取區sed程度命令
命令 | 含義 |
---|---|
h | 將模式空間裡面的內容複製到暫存空間快取區(覆蓋方式) |
H | 將模式空間裡面的內容複製到暫存空間快取區(追加方式) |
g | 將暫存空間裡面的內容複製到模式空間快取區(覆蓋方式) |
G | 將暫存空間裡面的內容複製到模式空間快取區(追加方式) |
x | 交換2個空間的內容 |
案例
快取空間資料交換
第一行貼上到最後一行(附加方式)
sed '1h;$G' sed.txt
第一行刪除後貼上到最後一行
sed '1{h;d};$G' sed.txt
第一行資料複製貼上替換其他行資料
sed '1h;2,$g' sed.txt
將前3行資料資料複製貼上到最後一行(追加)
sed '1,3H;$G' sed.txt
給每一行新增空行
#暫存空間預設就有空行
sed 'G' sed.txt