1. 統一實驗文本
# 創建包含下面內容的文件,后面的操作都會使用這個文件
[root@MongoDB ~]# cat person.txt 101,mike,CEO 102,jack,CTO 103,yy,CFO 104,feixue,CIO 105,tom,COO
2. 增刪改查
2.1 增
- a 追加文本到指定行后
- i 插入文本到指定行前
2a 追加到第二行后面
[root@MongoDB ~]# sed '2a 106,ben,CSO' person.txt 101,mike,CEO 102,jack,CTO 106,ben,CSO 103,yy,CFO 104,feixue,CIO 105,tom,COO
2i 把內容 插入到第二行前面
[root@MongoDB ~]# sed '2i 106,ben,CSO' person.txt 101,mike,CEO 106,ben,CSO 102,jack,CTO 103,yy,CFO 104,feixue,CIO 105,tom,COO
2.1.2 多行增加
\n 換行符 不加\n的話 都在一行顯示
[root@MongoDB ~]# sed '2a 106,ben,CSO\n107,peter,CCO' person.txt 101,mike,CEO 102,jack,CTO 106,ben,CSO 107,peter,CCO 103,yy,CFO 104,feixue,CIO 105,tom,COO
第二種方法:
后面加\ 接上輸入文本內容
[root@MongoDB ~]# sed '2a 106,ben,CSO \ > 107,peter,CCO' person.txt 101,mike,CEO 102,jack,CTO 106,ben,CSO 107,peter,CCO 103,yy,CFO 104,feixue,CIO 105,tom,COO
企業案例1:優化SSH配置(一鍵完成增加若干參數)
在我們學習系統優化時,有一個優化點:更改ssh服務遠程登錄的配置。主要的操作是在ssh的配置文件加入下面5行文本
Port 52113 PermitRootLogin no PermitEmptyPasswords no UseDNS no GSSAPIAuthentication no
我們可以使用vi命令編輯這個文本,但這樣就比較麻煩,現在想一條命令增加5行文本到第13行前?
[root@MongoDB ~]# sed '13i Port 52113\nPermitRootLogin no\nPermitEmptyPasswords no\nUseDNS no\nGSSAPIAuthentication no' /etc/ssh/sshd_config
2.2 刪
d 刪除指定的行
不指定行,就刪除所有行,所以沒有結果
[root@MongoDB ~]# sed 'd' person.txt
刪除文本第二行
[root@MongoDB ~]# sed '2d' person.txt 101,mike,CEO 103,yy,CFO 104,feixue,CIO 105,tom,COO
把文本 第二行到第5行內容刪掉
[root@MongoDB ~]# sed '2,5d' person.txt 101,mike,CEO
把文本的 第二行以上到結尾的行都刪掉
[root@MongoDB ~]# sed '2,$d' person.txt 101,mike,CEO
刪除文本第二行,第三行
[root@MongoDB ~]# sed '2,3d' person.txt 101,mike,CEO 104,feixue,CIO 105,tom,COO
刪除文本奇數行,留下偶數行
[root@MongoDB ~]# sed '1~2d' person.txt 102,jack,CTO 104,feixue,CIO
把文本 第二行到 2+2=4 第四行刪掉 2-4 刪掉
[root@MongoDB ~]# sed '2,+2d' person.txt 101,mike,CEO 105,tom,COO
匹配有jack字符串那行 刪除掉
[root@MongoDB ~]# sed '/jack/d' person.txt 101,mike,CEO 103,yy,CFO 104,feixue,CIO 105,tom,COO
匹配有jack字符串和yy字符串的行 刪除掉
[root@MongoDB ~]# sed '/jack/,/yy/d' person.txt 101,mike,CEO 104,feixue,CIO 105,tom,COO
把有jack字符串的行,和第三行刪掉
[root@MongoDB ~]# sed '/jack/,3d' person.txt 101,mike,CEO 104,feixue,CIO 105,tom,COO
改
2.3.1 按行替換
c 用新行取代舊行
2c 把輸入的文本 替換第二行文本
[root@MongoDB ~]# sed '2c 106,benson,CSO' person.txt 101,mike,CEO 106,benson,CSO 103,yy,CFO 104,feixue,CIO 105,tom,COO
文本替換
s:單獨使用→將每一行中第一處匹配的字符串進行替換 ==>sed命令
g:每一行進行全部替換 ==>sed命令s的替換標志之一,非sed命令
-i:修改文件內容 ==>sed軟件的選項
sed軟件替換模型(方框▇被替換成三角▲)
sed -i 's/▇/▲/g' test.log
sed -i 's#▇#▲#g' test.log
s要和g配合使用
觀察特點
- 兩邊是引號,引號里面的兩邊分別為
s
和g
,中間是三個一樣的字符/
或#
作為定界符。#
能在替換內容包含/
有助於區別。定界符可以是任意符號如:
或|
等,但當替換內容包含定界符時,需轉義即:
|
。經過長期實踐,建議大家使用#
作為定界符。 - 定界符
/
或#
,第一個和第二個之間的就是被替換的內容,第二個和第三個之間的就是替換后的內容。 s#▇#▲#g
,▇能用正則表達式,但▲不能用,必須是具體的。- 默認sed軟件是對模式空間(內存中的數據)操作,而-i選項會更改磁盤上的文件內容。
[root@MongoDB ~]# sed 's/jack/ben/g' person.txt 101,mike,CEO 102,ben,CTO 103,yy,CFO 104,feixue,CIO 105,tom,COO
-i 修改文件內容
[root@MongoDB ~]# sed -i 's/jack/ben/g' person.txt [root@MongoDB ~]# cat person.txt 101,mike,CEO 102,ben,CTO 103,yy,CFO 104,feixue,CIO 105,tom,COO
企業案例3:指定行修改配置文件
指定行精確修改配置文件,這樣可以防止修改多了地方。
[root@MongoDB ~]# sed '3s#0#9#' person.txt 101,mike,CEO 102,jack,CTO 193,yy,CFO 104,feixue,CIO 105,tom,COO
變量替換
再新建一個文本
[root@MongoDB ~]# cat test.txt a b a
賦值
[root@MongoDB ~]# x=a [root@MongoDB ~]# y=b [root@MongoDB ~]# echo $x $y a b
把文本里所有a字符串替換成b
沒有引號,用的就是雙引號
[root@MongoDB ~]# sed s#$x#$y#g test.txt b b b
單引號,沒有變量置換功能,所見所得,是什么輸出什么
[root@MongoDB ~]# sed 's#$x#$y#g' test.txt a b a
雙引號
[root@MongoDB ~]# sed "s#$x#$y#g" test.txt b b b
分組替換\( \)
和\1
的使用說明
sed軟件的\( \)
的功能可以記住正則表達式的一部分,其中,\1
為第一個記住的模式即第一個小括號中的匹配內容,\2
第二記住的模式,即第二個小括號中的匹配內容,sed最多可以記住9個。
例:
echo My name is mike,I am 13 years old. 如果想保留這一行的單詞mike,刪除剩下的部分,使用圓括號標記想保留的部分
[root@MongoDB ~]# echo My name is mike,I am 13 years old. |sed 's#^.*is \([a-z].*\),.*$#\1#g' mike
-r 支持正則表達式 , 不需要 加 \
[root@MongoDB ~]# echo My name is mike,I am 13 years old. |sed -r 's#^.*is ([a-z].*),.*$#\1#g' mike
()
是擴展正則表達式的元字符,sed軟件默認識別基本正則表達式,想要使用擴展正則需要使用\
轉義,即\(\)
。sed使用-r
選項則可以識別擴展正則表達式,此時使用\(\)
反而會出錯
特殊符號&
代表被替換的內容
&等於被替換的內容 0 ,把1到3行的0改成 100
[root@MongoDB ~]# sed '1,3s/0/10&/' person.txt 11001,mike,CEO 11002,jack,CTO 11003,yy,CFO 104,feixue,CIO 105,tom,COO
企業案例5:批量重命名文件
當前目錄下有文件如下所示:
[root@MongoDB ~]# mkdir -p /test/ [root@MongoDB ~]# cd /test/ ; touch stu_102999_{1..5}_finished.jpg [root@MongoDB test]# ls stu_102999_1_finished.jpg stu_102999_3_finished.jpg stu_102999_5_finished.jpg stu_102999_2_finished.jpg stu_102999_4_finished.jpg
要求用sed命令重命名,效果為stu_102999_1_finished.jpg==>stu_102999_1.jpg
,即刪除文件名的_finished
[root@MongoDB test]# ls| sed 's#^\(.*\).finished\(.*\)#mv & \1\2#g' mv stu_102999_1_finished.jpg stu_102999_1.jpg mv stu_102999_2_finished.jpg stu_102999_2.jpg mv stu_102999_3_finished.jpg stu_102999_3.jpg mv stu_102999_4_finished.jpg stu_102999_4.jpg mv stu_102999_5_finished.jpg stu_102999_5.jpg [root@MongoDB test]# [root@MongoDB test]# [root@MongoDB test]# ls| sed 's#^\(.*\).finished\(.*\)#mv & \1\2#g'|bash [root@MongoDB test]# ls stu_102999_1.jpg stu_102999_2.jpg stu_102999_3.jpg stu_102999_4.jpg stu_102999_5.jpg
查
p 輸出指定內容,但默認會輸出2次匹配的結果,因此使用n取消默認輸出
p要和 -n 配合使用
按行查詢
打印文本第二行
也可以這樣寫 sed -n '2'p
[root@MongoDB ~]# sed -n '2p' person.txt 102,jack,CTO
打印文本第二行,第三行
說明:取行就用sed,最簡單
[root@MongoDB ~]# sed -n '2,3p' person.txt 102,jack,CTO 103,yy,CFO
打印奇數行
[root@MongoDB ~]# sed -n '1~2p' person.txt 101,mike,CEO 103,yy,CFO 105,tom,COO
把所有行打印, sed -n ''p person.txt
或者
[root@MongoDB ~]# sed -n 'p' person.txt 101,mike,CEO 102,jack,CTO 103,yy,CFO 104,feixue,CIO 105,tom,COO [root@MongoDB ~]# sed -n ''p person.txt 101,mike,CEO 102,jack,CTO 103,yy,CFO 104,feixue,CIO 105,tom,COO
按字符串查詢
打印 匹配對應字符串的行
打印jack的行
[root@MongoDB ~]# sed -n '/jack/p' person.txt 102,jack,CTO
打印jack字符串 到 feixue字符串的行
[root@MongoDB ~]# sed -n '/jack/,/feixue/p' person.txt 102,jack,CTO 103,yy,CFO 104,feixue,CIO
混合查詢
打印第二行到 feixue那行
[root@MongoDB ~]# sed -n '2,/feixue/p' person.txt 102,jack,CTO 103,yy,CFO 104,feixue,CIO
如何只用一個sed取出第2和第4行???
[root@MongoDB ~]# sed -n '2p;4p' person.txt 102,jack,CTO 104,feixue,CIO