1)處理純文本文件,日誌,配置文件等==>Linux正則表達式
2)增長、刪除、修改、查詢vim
3)sed --versionbash
[root@wuhuang ~]# sed --versionapp GNU sed version 4.2.1編輯器 Copyright (C) 2009 Free Software Foundation, Inc.ide This is free software; see the source for copying conditions. There is NO工具 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,this to the extent permitted by law.spa
GNU sed home page: <http://www.gnu.org/software/sed/>.日誌 General help using GNU software: <http://www.gnu.org/gethelp/>. E-mail bug reports to: <bug-gnu-utils@gnu.org>. Be sure to include the word ``sed'' somewhere in the ``Subject:'' field. |
1.3 語法格式
sed [選項] [sed指令] [輸入文件]
sed -i.bak 's#oldboy#oldgirl#g' oldboy.txt
-i ----sed命令的參數
s ---sed指令
g ---小尾巴/修飾
sed是一種流編輯器,它是文本處理中很是中的工具,可以完美的配合正則表達式使用,功能與衆不同。處理時,把當前處理的行存儲在臨時緩衝區中,稱爲「模式空間」(pattern space),接着用sed命令處理緩衝區中的內容,處理完成後,把緩衝區的內容送往屏幕。接着處理下一行,這樣不斷重複,直到文件末尾。
1. p 打印模式空間的內容
2. -n 取消默認的sed軟件的輸出
建立環境
[root@wuhuang ~]# cd /wuhuang/ [root@wuhuang wuhuang]# touch person.txt [root@wuhuang wuhuang]# cat >>person.txt<<EOF > 101,wuhuang,CEO > 102,zhangyao,CTO > 103,Alex,COO > 104,yy,CFO > 105,feixue,CIO > EOF |
1: 取具體的某一行 sed -n '3p' person.txt
[root@wuhuang wuhuang]# sed -n '3p' person.txt 103,Alex,COO |
2. 顯示文件的最後一行 sed -n '$p' person.txt
[root@wuhuang wuhuang]# cat person.txt 101,wuhuang,CEO 102,zhangyao,CTO 103,Alex,COO 104,yy,CFO 105,feixue,CIO [root@wuhuang wuhuang]# sed -n '$p' person.txt 105,feixue,CIO |
3. 取包含xxx的行
[root@wuhuang wuhuang]# sed -n '/wuhuang/p' person.txt 101,wuhuang,CEO |
1. 連續的多行-地址範圍精講 連續的行使用 , 號
沒有地址,默認匹配全部行
sed -n ‘從哪裏來,哪裏去p’
數字 :sed -n '1,3p' person.txt
[root@wuhuang wuhuang]# sed -n '1,3p' person.txt 101,wuhuang,CEO 102,zhangyao,CTO 103,Alex,COO |
2. 正則地址範圍-模糊,容易找多了
正則 :sed -n '/wuhuang/p' person.txt
sed -n '/wuhuang/,/yy/p' person.txt
[root@wuhuang wuhuang]# sed -n '/oldboy/p' person.txt 101,wuhuang,CEO [root@wuhuang wuhuang]# sed -n '/o.*y/p' person.txt 101,wuhuang,CEO [root@wuhuang wuhuang]##顯示包含oldboy的行到包含yy的行 [root@wuhuang wuhuang]# sed -n '/oldboy/,/yy/p' person.txt 101,wuhuang,CEO 102,zhangyao,CTO 103,Alex,COO 104,yy,CFO |
3. 不連續的多行 使用 ; 號隔開(使用分號)
[root@wuhuang wuhuang]# #同一行放多個命令用; [root@wuhuang wuhuang]# sed -n '1p;4p;5p' person.txt 101,wuhuang,CEO 104,yy,CFO 105,feixue,CIO |
-r 支持擴展正則表達式
| 擴展正則,同時過濾多個字符
[root@wuhuang wuhuang]# sed -nr '/wuhuang|yy/p' person.txt 101,wuhuang,CEO 104,yy,CFO sed裏面的正則字符左右必須有「/」 |
a 追加append,在指定行後添加一行或多行文本
i 插入insert,在指定行前添加一行或多行文本
[root@wuhuang wuhuang]# sed '$a 106,wuxingge,UFO' person.txt 101,wuhuang,CEO 102,zhangyao,CTO 103,Alex,COO 104,yy,CFO 105,feixue,CIO 106,wuxingge,UFO [root@wuhuang wuhuang]# sed '2i 106,wuxingge,UFO\n107,lee,XO' person.txt 101,wuhuang,CEO 106,wuxingge,UFO 107,lee,XO 102,zhangyao,CTO 103,Alex,COO 104,yy,CFO 105,feixue,CIO |
換行符 \n
[root@wuhuang wuhuang]# sed '$a 106,wuxingge,UFO\n107,lee,XO' person.txt 101,wuhuang,CEO 102,zhangyao,CTO 103,Alex,COO 104,yy,CFO 105,feixue,CIO 106,wuxingge,UFO 107,lee,XO |
注:cat 命令多行追加
echo只能在追加到文件末尾 echo >>
vim 能夠寫入
d刪除 delete
$ 表明文件的最後一行
'1d' 或 '/oldboy/d'
[root@wuhuang wuhuang]# cat person.txt 101,wuhuang,CEO 102,zhangyao,CTO 103,Alex,COO 104,yy,CFO 105,feixue,CIO [root@wuhuang wuhuang]# sed '/wuhuang/d' person.txt 102,zhangyao,CTO 103,Alex,COO 104,yy,CFO 105,feixue,CIO |
[root@wuhuang wuhuang]# sed '1,4d' person.txt 105,feixue,CIO |
1. sed '/^$/d' person.txt
[root@wuhuang wuhuang]# sed -r '/^$/d' person.txt 101,wuhuang,CEO 102,zhangyao,CTO 103,Alex,COO 104,yy,CFO 105,feixue,CIO |
2. grep -v '^$' person.txt
[root@wuhuang wuhuang]# grep -v '^$' person.txt 101,wuhuang,CEO 102,zhangyao,CTO 103,Alex,COO 104,yy,CFO 105,feixue,CIO |
3. awk '!/^$/' person.txt
[root@wuhuang wuhuang]# awk '!/^$/' person.txt 101,wuhuang,CEO 102,zhangyao,CTO 103,Alex,COO 104,yy,CFO 105,feixue,CIO |
4. sed -n '/^$/!p' person.txt
[root@wuhuang wuhuang]# sed -n '/^$/!p' person.txt 101,wuhuang,CEO 102,zhangyao,CTO 103,Alex,COO 104,yy,CFO 105,feixue,CIO |
s 單獨使用——>將每一行中第一個匹配的字符串進行替換
[root@wuhuang wuhuang]# cat person.txt 101,wuhuang,CEO 102,zhangyao,CTO 103,Alex,COO 104,yy,CFO 105,feixue,CIO [root@wuhuang wuhuang]# sed 's#[0-9]#wuhuang#' person.txt wuhuang01,wuhuang,CEO wuhuang02,wuhuang,CTO wuhuang03,Alex,COO wuhuang04,yy,CFO wuhuang05,feixue,CIO |
g global 每一行進行所有替換——>sed指令s的替換標誌之一(全局替換)
[root@wuhuang wuhuang]# sed 's#[1-9]#AA#g' person.txt AA0AA,wuhuang,CEO AA0AA,zhangyao,CTO AA0AA,Alex,COO AA0AA,yy,CFO AA0AA,feixue,CIO |
sed -i.bak 's#[1-9]#AA#g' person.txt
-i.bak 先把文件備份爲 person.txt.bak ,而後再修改文件的內容
-i 參數要放在sed全部參數最後面
sed -i.bak.$(date +%F) 's#[1-9]#AA#g' person.txt
[root@wuhuang wuhuang]# sed -i.bak.$(date +%F) 's#[1-9]#AA#g' person.txt [root@wuhuang wuhuang]# cat person.txt AA0AA,wuhuang,CEO AA0AA,zhangyao,CTO AA0AA,Alex,COO AA0AA,yy,CFO AA0AA,feixue,CIO [root@wuhuang wuhuang]# cat person.txt.bak.2018-01-12 101,wuhuang,CEO 102,zhangyao,CTO 103,Alex,COO 104,yy,CFO 105,feixue,CIO |
[root@wuhuang wuhuang]# a=wuhuang 定義變量 [root@wuhuang wuhuang]# b=old 定義變量 [root@wuhuang wuhuang]# cat person.txt 101,wuhuang,CEO 102,zhangyao,CTO 103,Alex,COO 104,yy,CFO 105,feixue,CIO [root@wuhuang wuhuang]# sed "s#$a#$b#g" person.txt sed使用變量 101,old,CEO 102,zhangyao,CTO 103,Alex,COO 104,yy,CFO 105,feixue,CIO |
1.單引號-所見即所得
[root@wuhuang wuhuang]# echo 'stu{1..6},`pwd`' stu{1..6},`pwd` |
2.雙引號-對特殊符號進行解析 $ $() ``
[root@wuhuang wuhuang]# echo "stu{1..6},`pwd`" stu{1..6},/wuhuang [root@wuhuang wuhuang]# echo "I'm aaa" I'm aaa [root@wuhuang wuhuang]# echo 'I'm aaa' > ^C 想要顯示單引號是需用雙引號 |
3.不加引號和雙引號同樣,支持通配符{}*.txt
[root@wuhuang wuhuang]# echo stu{1..6},`pwd` stu1,/wuhuang stu2,/wuhuang stu3,/wuhuang stu4,/wuhuang stu5,/wuhuang stu6,/wuhuang |
4.反引號
[root@wuhuang wuhuang]# echo `pwd` ddd /wuhuang ddd |
5.3 反向引用
()的功能能夠禁止正則表達式的一部分
擴展正則,使用-r
\1引用第一個小括號中的匹配內容, \2引用第二個小括號中的匹配內容,sed最多能夠記住9個
sed &前面正則匹配到的內容
[root@wuhuang wuhuang]# echo 123456|sed -r 's#([0-9])#<\1>#g' <1><2><3><4><5><6> [root@wuhuang wuhuang]# echo 123456|sed 's#[0-9]#<&>#g' <1><2><3><4><5><6> [root@wuhuang wuhuang]# echo this is a test line | sed 's#.#<&>#g' <t><h><i><s>< ><i><s>< ><a>< ><t><e><s><t>< ><l><i><n><e> |
正則表達式 \w\+ 匹配每個單詞,使用 <&>替換它,& 對應於以前所匹配到的單詞
[root@wuhuang wuhuang]# echo this is a test line | sed 's#\w\+#<&>#g' <this> <is> <a> <test> <line> |
案例:echo "I am oldboy teacher." 若是想保留這一行的單詞oldboy
[root@wuhuang wuhuang]# echo "I am wuhuang teacher." |sed -r 's#.*(ol.*y).*#\1#g' wuhuang |
5.3.2 命令拼接——解決不會使用循環
將/oldboy/下全部.jpg的文件名修改成.avi
1. 先在屏幕上拼接出目標命令
[root@wuhuang wuhuang]# ls wuhuang*.jpg |sed -r 's#(.*)jpg#mv & \1avi#g' mv wuhuang01.jpg wuhuang01.avi mv wuhuang02.jpg wuhuang02.avi mv wuhuang03.jpg wuhuang03.avi mv wuhuang06.jpg wuhuang06.avi mv wuhuang07.jpg wuhuang07.avi mv wuhuang08.jpg wuhuang08.avi mv wuhuang09.jpg wuhuang09.avi mv wuhuang10.jpg wuhuang10.avi |
2. 最終交給 |bash執行
[root@wuhuang wuhuang]# ls wuhuang*.jpg |sed -r 's#(.*)jpg#mv & \1avi#g' |bash [root@wuhuang wuhuang]# ls wuhuang* wuhuang01.avi wuhuang03.avi wuhuang05.avi wuhuang07.avi wuhuang09.avi wuhuang.txt wuhuang02.avi wuhuang04.avi wuhuang06.avi wuhuang08.avi wuhuang10.avi |
5.4 拓展
rename from to file...
你要替換的內容 替換成什麼 替換哪些文件
rename jpg avi *.jpg
[root@wuhuang wuhuang]# rename jpg avi *.jpg [root@wuhuang wuhuang]# ls wuhuang01.avi wuhuang03.avi wuhuang05.avi wuhuang07.avi wuhuang09.avi wuhuang02.avi wuhuang04.avi wuhuang06.avi wuhuang08.avi wuhuang10.avi |
5.4.2 sed裏面表示非
-r 參數在前面
-ri 正常
[root@wuhuang wuhuang]# cat ett.txt wuhuang wuhuangoooy test [root@wuhuang wuhuang]# sed -ri 's#[o]+{2}#AAAA#g' ett.txt [root@wuhuang wuhuang]# cat ett.txt wuhuang wuhuangAAAAy test |
-ir 先把文件備份爲xxr,而後再替換文件中的內容
[root@wuhuang wuhuang]# cat ett.txt wuhuang wuhuangoy 源文件內容 test [root@wuhuang wuhuang]# sed -ir 's#[l]+{2}#o#g' ett.txt sed -ir先備份 [root@wuhuang wuhuang]# ll ett.* -rw-r--r-- 1 root root 20 Jan 12 19:58 ett.txt -rw-r--r-- 1 root root 20 Jan 12 19:56 ett.txtr 備份爲ett.txtr [root@wuhuang wuhuang]# cat ett.txt 由於在上面的命令裏r已經不是參數,因此sed 默認不支持擴展正則,文件沒有被修改,只是備份 wuhuang wuhuangoy test [root@wuhuang wuhuang]# cat ett.txtr wuhuang wuhuangoy test [root@wuhuang wuhuang]# sed -rir 's#[l]+{2}#o#g' ett.txt 從新給sed 加上 -r 參數,使 sed支持擴展正則 [root@wuhuang wuhuang]# ll ett.* -rw-r--r-- 1 root root 19 Jan 12 19:58 ett.txt -rw-r--r-- 1 root root 20 Jan 12 19:58 ett.txtr 新備份的文件覆蓋了剛纔的文件 [root@wuhuang wuhuang]# cat ett.txt 源文件被替換 wuhuang wuhuangoy test [root@wuhuang wuhuang]# cat ett.txtr 備份文件內容不變 wuhuang wuhuangoy test |
6.2 -i禁止與-n一塊兒使用(回顧sed的執行過程)
-i與-n一塊兒使用會把源文件的內容清空
[root@wuhuang wuhuang]# cat ett.txtr wuhuang wuhuangoy test [root@wuhuang wuhuang]# sed -ni 's#oldboy#123456#g' ett.txtr [root@wuhuang wuhuang]# cat ett.txtr |wc -l 0 |