內容:
1.sed命令介紹
2.語法格式,常用功能
? ?查詢 ?增加 ?替換 批量修改文件名
第1章?sed是什么
字符流編輯器 Stream Editor
第2章?sed功能與版本
處理出文本文件,日志,配置文件等
增加,刪除,修改,查詢
sed ?--version
?
sed ?-i 修改文件內容
?
第3章?語法格式
3.1?語法格式
sed [選項] [sed指令] [輸入文件]
sed -i.bak 's#oldboy#oldgril#g' oldbboy.txt
先備份在修改
-i ??---sed的參數
修改
-s ???--sed指令
g ??---小尾巴/修飾
?
sed ?找誰 ?干啥
找誰----條件(查找)
干啥----命令 ?替換 刪除 ?增加
?
3.2?命令執行過程
sed 特性:默認輸出
??-n 取消默認輸出
模式空間:內存中專門為sed騰出的一塊地
第4章?常用功能
4.1?查詢:
4.1.1?#單行 - 行號
顯示第幾行
[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
‘//’???//內支持正則表達式 ????????過濾內容
4.1.2?多行 連續
找出第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/’
?
4.2?增加
4.2.1?多行增加: ?\n 換行符 ?(三種方法)
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 ?????一行
4.2.2?不顯示文件中空行
grep -v '^$' person.txt
sed '/^$/d' person.txt
awk '!/^$/' person.txt
sed -n '/^$/!p' person.txt
?
!(嘆號) sed ?awk ?find 中表示取反
4.3?替換
4.3.1?不加g ?將每一行中第一處匹配的字符串進行替換
[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
?
?
?
?
4.3.2?sed 先備份在修改文件內容
sed ?-i.bak ‘s#[1-9]#AAA#g’?person.txt
先把文件備份為person.txt.bak
然后再修改文件內容
4.3.3?變量替換 ????雙引號識別 ????### ?把###之間定義變量
[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>
?
?
4.4?新案列:批量修改文件名 ???命令的拼接
把.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
4.4.1?方法一:命令拼接
[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執行
4.4.2?方法二:rename
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語句執行多條命令 ???????????????;
?
4.5?sed命令常見的坑 ?-ri ??和 ?-ir
4.5.1?-r與-i同時使用
***-r參數必須在前面
-ri
正常
-ir
先把文件備份為xxxr
然后再替換文件中的內容
4.5.2?-i禁止與-n一起使用
會把原文件內容清空
轉載于:https://blog.51cto.com/13517084/2069074