1.sed命令介紹
正則表達式
2.語法格式,經常使用功能bash
查詢 增長 替換 批量修改文件名app
字符流編輯器 Stream Editor編輯器
處理出文本文件,日誌,配置文件等ide
增長,刪除,修改,查詢spa
sed --version日誌
sed -i 修改文件內容blog
sed [選項] [sed指令] [輸入文件]圖片
sed -i.bak 's#oldboy#oldgril#g' oldbboy.txt內存
先備份在修改
-i ---sed的參數
修改
-s --sed指令
g ---小尾巴/修飾
sed 找誰 幹啥
找誰----條件(查找)
幹啥----命令 替換 刪除 增長
3.2 命令執行過程
sed 特性:默認輸出
-n 取消默認輸出
模式空間:內存中專門爲sed騰出的一塊地
顯示第幾行
[root@oldboyedu43-lnb oldboy]# sed -n '3p' person.txt
103,Alex,COO
顯示包含oldboy的行
#包含oldboy的行
[root@oldboyedu43-lnb oldboy]# sed -n '/oldboy/p' person.txt
101,oldboy,CEO
‘//’ //內支持正則表達式 過濾內容
找出第1到3行
sed -n ‘1,3p person.ttx’
#顯示包含oldboy的行到包含yy的行
[root@oldboy-gao oldboy]# sed -n '/oldboy/,/yy/p' person.txt
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
顯示文件的第1,4,5行
[root@oldboy-gao oldboy]# sed -n '1p;4p;5p' person.txt
101,oldboy,CEO
104,yy,CFO
105,feixue,CIO
同一行多條命令用;(分號)分隔
小結:
1. 行號
2. 正則表達式 ‘//p’
3. 範圍 ‘/oldboy/,/yy/’
1. 文件的最後一行增長兩行
106,wuxingge,UFO
107,lee,XO
1)echo
echo -e "106,wuxingge,UFO\n107,lee,XO" >>person.txt
2)cat
[root@oldboy-gao oldboy]# cat >>person.txt <<ha
106,wuxingge,UFO
107,lee,XO
ha
3) sed 行號a 在文件中某一行追加內容
[root@oldboy-gao oldboy]# sed '$a106,wuxingge,UFO\n107,lee,XO' person.txt 最後一行
a === append 追加 --下一行
i ==== insert 插入 -----上一行
錯誤
[root@oldboy-gao oldboy]# sed '2a gyf is a student\nhe's a good boy' person.txt
> ^C
三個單引號亂了
解決:單引號換雙引號
刪除 d 一行
grep -v '^$' person.txt
sed '/^$/d' person.txt
awk '!/^$/' person.txt
sed -n '/^$/!p' person.txt
!(歎號) sed awk find 中表示取反
[root@oldboy-gao oldboy]# cat person.txt
101,oldboy,CEO
[root@oldboy-gao oldboy]# sed 's#[1-9]#AAA#g' person.txt|egrep -v '^$'
AAA0AAA,oldboy,CEO
加g --global 每一行進行所有替換 ---> sed指令s的替換標誌之一(全局替換)
[root@oldboy-gao oldboy]# sed 's#[1-9]#AAA#' person.txt|egrep -v '^$'
AAA01,oldboy,CEO
sed -i.bak ‘s#[1-9]#AAA#g’ person.txt
先把文件備份爲person.txt.bak
而後再修改文件內容
[root@oldboyedu43-lnb oldboy]# x=oldboy 定義x y 兩個變量
[root@oldboyedu43-lnb oldboy]# y=oldgirl
[root@oldboyedu43-lnb oldboy]# sed "s#$x#$y#g" person.txt $x $y 應用變量
101,oldgirl,CEO
102,zhangyao,CTO
2. 後項引用
1)把匹配到的內容按規定格式形式
[root@oldboy-gao oldboy]# echo '123456'|sed -r 's#(.*)#<\1>#g'
<123456>
2)引用前面匹配到的內容
[root@oldboy-gao oldboy]# echo '123456'|sed -r 's#(.*)#<\1>#g'
<123456>
新方法 :&表示前面正則匹配到的內容
[root@oldboy-gao oldboy]# echo '123456'|sed 's#.*#<&>#g'
<123456>
前面每一個數字都加上< >號
[root@oldboy-gao oldboy]# echo '123456'|sed 's#.#<&>#g'
<1><2><3><4><5><6>
把.jpg修改成.avi
-rw-r--r--. 1 root root 0 Jan 10 00:24 oldboy01.jpg
-rw-r--r--. 1 root root 0 Jan 10 00:24 oldboy02.jpg
-rw-r--r--. 1 root root 0 Jan 10 00:24 oldboy03.jpg
-rw-r--r--. 1 root root 0 Jan 10 00:24 oldboy04.jpg
-rw-r--r--. 1 root root 0 Jan 10 00:24 oldboy05.jpg
[root@oldboy-gao oldboy]# ls *.jpg|sed -r 's#(.*)jpg#mv & \1avi#g'
mv oldboy01.jpg oldboy01.avi
mv oldboy02.jpg oldboy02.avi
|bash 把前面的輸出交給 bash(命令解釋器) 執行
[root@oldboy-gao oldboy]# ls *.jpg|sed -r 's#(.*)jpg#mv & \1avi#g'|bash
[root@oldboy-gao oldboy]# ls *.avi
oldboy01.avi oldboy03.avi oldboy05.avi oldboy07.avi oldboy09.avi
oldboy02.avi oldboy04.avi oldboy06.avi oldboy08.avi oldboy10.avi
小結:
1. 命令拼接--解決不會循環
2. 先在屏幕上拼接出目標命令--最終交給bash執行
rename from to file
你要替換的內容 替換成什麼 替換哪些文件
jpg avi *.jpg
[root@oldboy-gao oldboy]# rename jpg avi *.jpg
[root@oldboy-gao oldboy]# ls *.avi
oldboy01.avi oldboy03.avi oldboy05.avi oldboy07.avi oldboy09.avi
oldboy02.avi oldboy04.avi oldboy06.avi oldboy08.avi oldboy10.avi
sed用法小結:
1. 排除 !
2. 特殊符號===獲取行號 =
3. 一條sed語句執行多條命令 ;
***-r參數必須在前面
-ri
正常
-ir
先把文件備份爲xxxr
而後再替換文件中的內容
會把原文件內容清空