首頁 > 軟體

sed命令的基本使用方法

2020-06-16 16:44:00

命令格式解析

1.常見命令選項

 -n 遮蔽預設輸出

 -i 直接修改文字內容

 -f 使用sed指令碼

 -e 可指定多個處理動作

 -r 啟用擴充套件正規表示式,若與其他選項一起使用,應把r放在最前

 -{} 可組合多個命令,以分號分割

基本的處理動作

p  列印行     4,6p  輸出4,5,6行
 4p,6p  輸出4行,6行
d  刪除行  4,6d  刪除4,5,6行
s  字串替換 s/old/new/  將每行的第一個old替換成new 
s/old/new/3  將每行的第三個old替換成new 
s/old/new/g  將全部的old替換成new 

替換操作的分隔符"/"可以用其他字元代替,如&,#,便於修改檔案路徑

輸出文字
sed -n 'p' aa.txt 輸出書有行,相當於cat aa.txt相同
sed -n '6p' aa.txt 輸出第6行
sed -n '4,7p' aa.txt 輸出4,5,6,7行
sed -n '4,+5p' aa.txt 輸出第4行以及其後的5行
sed -n '/^root/p' aa.txt 輸出以root開頭的行
sed -n 'p,n' aa.txt 輸出奇數行,n表示讀取下一行文字
sed -n 'n,p' aa.txt 輸出偶數行,n表示讀取下一行文字
sed -n '5,${n,p}' aa.txt 輸出從第五行至檔案末尾的所有偶數行
sed -n '$=' aa.txt 輸出檔案的行數
刪除文字
sed -n '4,7d' aa.txt 刪除4,5,6,7行
sed -n '/bin/d' aa.txt 刪除包含bin的行
sed -n '/bin/!d' aa.txt 刪除不包含bin的行,!表示取反
sed -n '/^bin/d' aa.txt 刪除以bin開頭的行
sed -n '/^$/d' aa.txt 刪除所有空行
sed -n '/^$/{n;/^$/d}' aa.txt 刪除重複空行,連續的空行只保留一個
替換文字
sed -n 's/aa/AA/' aa.txt 將每行中的第一個aa替換成AA
sed -n 's/aa/AA/4' aa.txt 將每行中的第4個aa替換成AA
sed -n 's/aa/AA/g' aa.txt 將文字所有的aa替換成AA
sed -n 's/aa//g' aa.txt 將文字所有的aa替換成空,相當於刪除
sed -n 's/aa/&s/g' aa.txt 將文字所有的aa替換成aas,&表示查詢到的字元
sed -n '4,6s/^/#/' aa.txt 將文字4,5,6行的開頭加上#,相當於注釋程式碼
sed -n '4,6s/^#//' aa.txt 將文字4,5,6行的開頭#號去掉,相當於刪除註釋

sed的文字塊處理 

操作符 用途 命令示範
i 行前插入文字 2iAA,在第2行前面插入文字行AA
2,4iAA,在第2-4行每行前面插入文字行AA
a 行後插入文字 2aAA,在第2行後面插入文字行AA
2,4aAA,在第2-4行每行後面插入文字行AA
c 替換當前行 2cAA,把第二行內容替換成AA

匯入到處操作

操作符 用途 命令示範 解釋
r 讀取文字 2r a.txt 在第2行的下面插入a.txt檔案
2,4r a.txt 在第2-4行每行下面插入a.txt檔案
w 儲存到檔案 2w a.txt 將第2行的內容儲存為a.txt檔案
2,4w a.txt 將第2-4行的內容儲存為a.txt檔案

sed複製剪下

模式空間

  -存放當前處理的行,將處理的結果輸出

  -若當前行不符合處理條件,則原樣輸出

  -處理完當前行再讀入下一行進行處理

保持空間

  -類似於windows的剪下板

  -預設存放一個空行(換行符 n)

基本動作

  複製

  H:模式空間--->追加--->保持空間

  h:模式空間--->覆蓋--->保持空間

  貼上

  G:保持空間--->追加--->模式空間

  g:保持空間--->覆蓋--->模式空間

示範

1)把1-3行複製到檔案末尾

[root@localhost ~]# cat a.txt
222222
444444444444
[root@localhost ~]# sed '1,3H;$G' a.txt  #此處有空行時因為第一次是在保持空間裡追加,而保持空間預設有一個空行,注意理解H和h,G和g的區別
222222
444444444444
222222
[root@localhost ~]# sed '1h;2,3H;$G' a.txt  #此處沒有空行,因為第一次是覆蓋保持空間的空行
222222
444444444444
222222

2)把第一行剪下到檔案末尾

[root@localhost ~]# sed '1h;1d;$G' a.txt
222222
333333333
444444444444
111

3)把第1,2行剪下到檔案末尾

[root@localhost ~]# sed '1h;2H;1,2d;$G' a.txt
333333333
444444444444
111
222222

 !取反操作

1)列出不使用bash的使用者有哪些

[root@localhost ~]# sed -n '/bash$/!p' /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
saslauth:x:499:76:Saslauthd user:/var/empty/saslauth:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

修改啟動項

[root@localhost ~]# sed  '/^id/s/[0-6]/3/g' /etc/inittab
id:3:initdefault:

其他複雜使用

1)刪除檔案中每行的第二個、最後一個字元

分兩次替換操作,第一次替換掉第2個字元,第二次替換掉最後一個字元:

[root@localhost ~]# sed 's/.//2;s/.$//' a.txt

2)刪除檔案中每行的第二個、最後一個單詞

分兩次替換操作,第一次替換掉第2個單詞,第二次替換掉最後一個單詞:

[root@localhost ~]# sed -r 's/[a-Z]+//2;s/[a-Z]+([^a-Z]*)$/1/' a.txt

3)將檔案中每行的第一個、第二個字元互換

每行文字拆分為“第1個字元”、“第2個字元”、“剩下的所有字元”三個部分,然後通過替換操作重排順序為“2-1-3”:

[root@localhost ~]# sed -r 's/^(.)(.)(.*)/213/' a.txt

4)將檔案中每行的第一個、第二個單詞互換

每行文字拆分為“第1個單詞”、“單詞分隔”、“第2個單詞”、“剩下的所有字元”四個部分,然後通過替換操作重排順序為“3-2-1-4”:

[root@localhost ~]# sed -r 's/([a-Z]+)([^a-Z]*)([a-z]+)(.*)/3214/' a.txt

5)刪除檔案中所有的數位、行首的空格

因原檔案內沒有數位,行首也沒有空格,這裡稍作做一點處理,生成一個新測試檔案:

[root@localhost ~]# sed 's/o/o7/;s/l/l4/;3,5s/^/  /' a.txt > b.txt

6)刪除所有數位、行首空格的操作

[root@localhost ~]# sed -r 's/[0-9]//g;s/^( )+//' a.txt

7)為檔案中每個大寫字母新增括號

使用“&”可呼叫s替換操作中的整個查詢串,所以可參考下列操作解決:

[root@localhost ~]# sed 's/[A-Z]/(&)/g' a.txt

  或者

[root@localhost ~]# sed -r 's/([A-Z])/(1)/g' a.txt


IT145.com E-mail:sddin#qq.com