sed:文本流編輯器 主要是對文件的快速增刪改查,查詢功能中最常用的是過濾,取行 sed [選項] [sed內置命令字元] [輸入文件] Options: -n:取消預設的sed輸出,常與sed內置命令p連用 -e:直接在命令行界面進行sed動作編輯,多點編輯 -r:使用擴展的正則表達式 -i:直接 ...
sed:文本流編輯器
主要是對文件的快速增刪改查,查詢功能中最常用的是過濾,取行
sed [選項] [sed內置命令字元] [輸入文件]
Options:
-n:取消預設的sed輸出,常與sed內置命令p連用
sed -n '/要過濾的內容/或者行號p'
-e:直接在命令行界面進行sed動作編輯,多點編輯
-r:使用擴展的正則表達式
-i:直接修改讀取的文件內容,而不是由屏幕輸出。若是不加此參數,就只是修改記憶體中的數據,不影響磁碟中的數據
script:
地址定界:
1、不給地址,對全文進行處理
2、單地址,
#:指定的行
/pattern/:被此處模式所能夠匹配到的每一行
地址範圍:
#,#:從#到#之間的行,包括##
#,+#:從#行到#+#行
/pat1/,/pat2/:匹配第一次被模式一和第一次被模式二匹配的行之間的行,貪婪模式!!!
#,/par1/:第#行到第一次被part1匹配的行
編輯命令:
d:刪除模式空間匹配的行
sed '3d' file.txt # 數字表示行號 sed '3,4d' file.txt # 3-4行刪除
p:顯示模式空間中的內容
sed -n '2p' file.txt # 匹配第二行內容,如果不加-n,會將匹配的內容輸出到屏幕兩次
sed -n '2p;4p' person.txt 2和4行
sed -n '/xiaolizi1/p;/xiaolizi2/p' person.txt
a[\]text:在指定行的後面追加文本,可使用\n實現多行追加
# 在第二行後追加內容 sed '2a 要追加的內容' file.txt
# 追加多行內容
sed '2a 要追加的內容\n要追加的內容' file.txt
sed '$a 106,xiaolizi1\n107,xiaolizi2' person.txt # 在最後一行追加兩行內容 $表示結尾
i[\]text:在指定行的前面追加文本
c[\]text:替換行為單行或多行文本
w /path/somefile:保存模式空間匹配的行到指定文件
r /path/somefile:讀取指定的文件的文本至模式空間匹配到的行的行後
=:為模式空間中的行列印行號
!: 對模式空間匹配的行取反處理
查找替換:
s///:支持使用其他分隔符:s@@@,s### ...
sed 's#替換前的內容#替換後的內容#g' file.txt # g表示整個文本內容,也就是全局替換,如果不添加,只會替換第一個匹配到的內容
# 關於反向引用
[root@oldgirl ~]# #echo 123456 ==》 <123456> # 轉換成此類格式的 \1表示引用前面第一個括弧內的內容
[root@oldgirl ~]# echo 123456|sed -r 's#(.*)#<\1>#g'
<123456>
[root@oldgirl ~]# #echo 123456 ==》<1><2><3><4><5><6>
[root@oldgirl ~]# echo 123456|sed -r 's#([1-6])#<\1>#g'
<1><2><3><4><5><6>
[root@oldgirl ~]# echo 123456|sed -r 's#(.)#<\1>#g'
<1><2><3><4><5><6>
[root@oldgirl ~]# echo 123456|sed -r 's#.#<&>#g'
<1><2><3><4><5><6>
[root@oldgirl ~]# echo 123456|sed -r 's#.*#<&>#g'
<123456>
# 舉個慄子
# 需求將oldboy*.jpg圖片變為avi擴展名文件
# 第一個裡程:找出要替換的文件信息
[root@oldgirl ~]# ls oldboy*.jpg
oldboy01.jpg oldboy03.jpg oldboy05.jpg oldboy07.jpg oldboy09.jpg
oldboy02.jpg oldboy04.jpg oldboy06.jpg oldboy08.jpg oldboy10.jpg
[root@oldgirl ~]# ls oldboy*.jpg|sed 's#.*#&#g'
oldboy01.jpg
oldboy02.jpg
oldboy03.jpg
oldboy04.jpg
oldboy05.jpg
oldboy06.jpg
oldboy07.jpg
oldboy08.jpg
oldboy09.jpg
oldboy10.jpg
# 第二個裡程:拼湊批量修改文件的命令
[root@oldgirl ~]# ls oldboy*.jpg|sed 's#.*.jpg#&#g'
oldboy01.jpg
oldboy02.jpg
oldboy03.jpg
oldboy04.jpg
oldboy05.jpg
oldboy06.jpg
oldboy07.jpg
oldboy08.jpg
oldboy09.jpg
oldboy10.jpg
[root@oldgirl ~]# ls oldboy*.jpg|sed -r 's#(.*)jpg#\1#g'
oldboy01.
oldboy02.
oldboy03.
oldboy04.
oldboy05.
oldboy06.
oldboy07.
oldboy08.
oldboy09.
oldboy10.
[root@oldgirl ~]# ls oldboy*.jpg|sed -r 's#(.*)jpg#mv \1jpg#g'
mv oldboy01.jpg
mv oldboy02.jpg
mv oldboy03.jpg
mv oldboy04.jpg
mv oldboy05.jpg
mv oldboy06.jpg
mv oldboy07.jpg
mv oldboy08.jpg
mv oldboy09.jpg
mv oldboy10.jpg
[root@oldgirl ~]# ls oldboy*.jpg|sed -r 's#(.*)jpg#mv \1jpg \1avi#g'
mv oldboy01.jpg oldboy01.avi
mv oldboy02.jpg oldboy02.avi
mv oldboy03.jpg oldboy03.avi
mv oldboy04.jpg oldboy04.avi
mv oldboy05.jpg oldboy05.avi
mv oldboy06.jpg oldboy06.avi
mv oldboy07.jpg oldboy07.avi
mv oldboy08.jpg oldboy08.avi
mv oldboy09.jpg oldboy09.avi
mv oldboy10.jpg oldboy10.avi
# 第三里程碑:將命令輸出的信息,進行執行
[root@oldgirl ~]# ls oldboy*.jpg|sed -r 's#(.*)jpg#mv \1jpg \1avi#g'|bash
[root@oldgirl ~]# ls oldboy*.avi
oldboy01.avi oldboy03.avi oldboy05.avi oldboy07.avi oldboy09.avi
oldboy02.avi oldboy04.avi oldboy06.avi oldboy08.avi oldboy10.avi
# 以上只是一個需求,為了演示反向引用,如果批量重命名的話,使用rename即可
替換標記:
g:行內全局替換
p:顯示替換成功的行
w file:將替換成功的行保存至文件中
+ g:[address[,address]]g 將hold space中的內容拷貝到pattern space中,原來pattern space里的內容清除
+ G:[address[,address]]G 將hold space中的內容append到pattern space\n後
+ h:[address[,address]]h 將pattern space中的內容拷貝到hold space中,原來的hold space里的內容被清除
+ H:[address[,address]]H 將pattern space中的內容append到hold space\n後
+ d:[address[,address]]d 刪除pattern中的所有行,並讀入下一新行到pattern中
+ D:[address[,address]]D 刪除multiline pattern中的第一行,不讀入下一行
PS:不論是使用G、g還是H、h,它們都是將hold space裡面的內容“copy”到patt
h: 把模式空間中的內容覆蓋至保持空間中
H:把模式空間中的內容追加至保持空間中
g: 從保持空間取出數據覆蓋至模式空間
G:從保持空間取出內容追加至模式空間
x: 把模式空間中的內容與保持空間中的內容進行互換
n: 讀取匹配到的行的下一行覆蓋至模式空間
N:讀取匹配到的行的下一行追加至模式空間
d: 刪除模式空間中的行
D:刪除當前模式空間開端至\n的內容(不再傳至標準輸 出),放棄之後的命令,但是對剩餘模式空間重新執行sed