linux sed 命令 實現對文件的增刪改替換查 實驗


 

 

 

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配合使用

觀察特點

  1. 兩邊是引號,引號里面的兩邊分別為sg,中間是三個一樣的字符/#作為定界符。#能在替換內容包含/有助於區別。定界符可以是任意符號如:|等,但當替換內容包含定界符時,需轉義即: |。經過長期實踐,建議大家使用#作為定界符。
  2. 定界符/#,第一個和第二個之間的就是被替換的內容,第二個和第三個之間的就是替換后的內容。
  3. s#▇#▲#g,▇能用正則表達式,但▲不能用,必須是具體的。
  4. 默認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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM