首頁 > 軟體

Linux正規表示式sed 詳述

2020-06-16 18:02:16

sed、awk工具可以實現文字替換並且把替換的文字輸出到螢幕上
sed和awk都是流式編輯器,是針對文件的行來操作的。sed通常用來替換操作。

範例的文字內容,以下操作根據此文字。
[root@linuxidc ~]# cat test.txt 
rot:x:0:0:rot:/rot:/bin/bash
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
rooooot:x:0:0/roooooot:/bin/bash
11111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

1、列印某一行
sed -n 'n'p filename 單引號內的n是一個數位,表示第幾行;p也可以寫到引號內;

範例,列印passwd第3-5行;

[root@linuxidc ~]# sed -n '3,5'p /etc/passwd
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

列印所有行

[root@linuxidc ~]# sed -n '1,$'p /etc/passwd

列印某一行,並且要顯示行號,需要和grep一起使用;

[root@localhost ~]# grep -n '.*' test.txt | sed -n '1'p
1:rrt

2、列印包含某個字串的行

字串需要用/ /括起來;grep中的特殊符號^ $ . * 同樣適用於sed中。
[root@linuxidc ~]# sed -n '/root/'p /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

列印包含/sbin/nologin的行,/需要進行脫意;
[root@linuxidc ~]# sed -n '//sbin/nologin/'p 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

列印以d開頭的行;列印以in結尾的;列印r與o字母中間有2個任意字元的;列印包含2個o及多個o的行;
[root@linuxidc ~]# sed -n '/^d/'p test.txt 
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@linuxidc ~]# sed -n '/in$/'p test.txt 
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@linuxidc ~]# sed -n '/r..o/'p test.txt
rooooot:x:0:0/roooooot:/bin/bash
[root@linuxidc ~]# sed -n '/ooo*/'p test.txt
root:x:0:0:root:/root:/bin/bash
rooooot:x:0:0/roooooot:/bin/bash

3、-e可以實現多個行為
[root@linuxidc ~]# sed -e '1'p -e '/111/'p -n test.txt 
rot:x:0:0:rot:/rot:/bin/bash
11111111111111111111111111111111

可以用-e寫多個;-e相當於傳送帶,先匹配最前面的列印,再匹配後面的列印,所以第一行會列印2次;

[root@localhost ~]# sed -e '/root/p' -e '/bash/p' -n 1.txt
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
user1:x:500:500::/home/user1:/bin/bash
user2:x:501:501::/home/user2:/bin/bash

-e後面也可以用;分號;-n不能寫到-e的後面,可以寫在-e的前面或最後面;
[root@localhost ~]# sed -e '/root/p;/bash/p' -n 1.txt
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
user1:x:500:500::/home/user1:/bin/bash
user2:x:501:501::/home/user2:/bin/bash

4、刪除某行或者多行

‘d’ 這個字元就是刪除的動作了,不僅可以刪除指定的單行以及多行,而且還可以刪除匹配某個字元的行,另外還可以刪除從某一行一直到文件末行。

範例,刪除第一行;刪除1-3行;刪除包含root關鍵詞的行;刪除第3行到最後一行所有行;
[root@linuxidc ~]# sed '1'd test.txt 
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
rooooot:x:0:0/roooooot:/bin/bash
11111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
[root@linuxidc ~]# sed '1,3'd test.txt 
rooooot:x:0:0/roooooot:/bin/bash
11111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
[root@linuxidc ~]# sed '/root/'d test.txt
rot:x:0:0:rot:/rot:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
rooooot:x:0:0/roooooot:/bin/bash
11111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
[root@linuxidc ~]# sed '3,$'d test.txt 
rot:x:0:0:rot:/rot:/bin/bash
root:x:0:0:root:/root:/bin/bash

5、替換字元或替換字串

範例,替換第一行字母r為R;替換1-2行中ot為to;替換所有行中ot為to;
[root@localhost ~]# sed '1s/r/R/g' test.txt 
RRt
[root@linuxidc ~]# sed '1,2s/ot/to/g' test.txt 
rto:x:0:0:rto:/rto:/bin/bash
roto:x:0:0:roto:/roto:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
rooooot:x:0:0/roooooot:/bin/bash
11111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
[root@linuxidc ~]# sed 's#ot#to#g' test.txt 
rto:x:0:0:rto:/rto:/bin/bash
roto:x:0:0:roto:/roto:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
rooooto:x:0:0/roooooto:/bin/bash
11111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

與vim編輯器裡面替換一樣的命令格式,s代表替換,g代表全域性,不加g的話只替換行的第一個;可以使用# @作為分隔符。

1s代表只替換第一行;1,3s代表第一行到第三行;不加行數的話預設為全部行。

範例,刪除文件中所有的數位's/[0-9]//g'  如刪除文件中所有的字母's/[a-zA-Z]//g'刪除所有的數位和字母's/[0-9a-zA-Z]//g'
[root@linuxidc ~]# sed 's/[0-9]//g' test.txt 
rot:x:::rot:/rot:/bin/bash
root:x:::root:/root:/bin/bash
daemon:x:::daemon:/sbin:/sbin/nologin
rooooot:x::/roooooot:/bin/bash
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

範例,刪除文件中所有的字母
[root@linuxidc ~]# sed 's/[a-z]//g' 1.txt 
::0:0:/://
::11:0::/://
::11:0::/://
::0:0:/://
1111111111111111111111111111111

範例,刪除文件中不是英文字母的(數位和特殊符號)
[root@linuxidc ~]# sed 's/[^a-z]//g' 1.txt 
rotxrotbinbash
operatorxoperatorrootsbinnologin
operatorxoperatorroootsbinnologin
rooootxroooootbinbash
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

範例,刪除文件中不是數位的(英文字母和特殊符號)

[root@linuxidc ~]# sed 's/[^0-9]//g' 1.txt 
00
110
110
00
1111111111111111111111111111111

範例,把文件中的小寫字母全部替換為大寫字母 's/[a-z]/u&/g'
[root@linuxidc ~]# sed 's/[a-z]/u&/g' 1.txt 
ROT:X:0:0:/ROT:/BIN/BASH
OPERATOR:X:11:0:OPERATOR:/ROOT:/SBIN/NOLOGIN
OPERATOR:X:11:0:OPERATOR:/ROOOT:/SBIN/NOLOGIN
ROOOOT:X:0:0:/ROOOOOT:/BIN/BASH
1111111111111111111111111111111
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

範例,把文件中的大寫字母全部替換為小寫字母 's/[A-Z]/l&/g'

[root@linuxidc ~]# sed 's/[A-Z]/l&/g' 1.txt 
rot:x:0:0:/rot:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
operator:x:11:0:operator:/rooot:/sbin/nologin
roooot:x:0:0:/rooooot:/bin/bash
1111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

替換的同時加-n p 列印特定的行;

[root@linuxidc ~]# sed -n '1s/[a-z]/u&/g'p 1.txt 
ROT:X:0:0:/ROT:/BIN/BASH

6、調換二個字串的位置
sed -r 's/([^:]+)(:.*:)([^:]+$)/321/'
[^:]非冒號,不是冒號的所有字元
-r, --regexp-extended  在指令碼中使用擴充套件正規表示式; 加r選項的意思為後面不用再加脫意 
( )括號括起來是分段的意思,
321    是代表3調換1,後面的內容調換到前面

範例,aa與ff調換;加-r選項不用加脫意符號;不加-r ( )括號左右都需要加脫意;調換多行用最後一個;
[root@localhost ~]# cat 1.txt 
aa:bb:cc:dd:ee:ff
[root@localhost ~]# sed -r 's/(aa)(.*)(ff)/321/' 1.txt
ff:bb:cc:dd:ee:aa
[root@localhost ~]# sed 's/(aa)(.*)(ff)/321/' 1.txt 
ff:bb:cc:dd:ee:aa
[root@localhost ~]# sed -r 's/([^:]+)(:.*:)([^:]+$)/321/' 1.txt 
ff:bb:cc:dd:ee:aa

範例,rot與/bin/bash進行調換
[root@localhost ~]# grep 'rot' test.txt
rot:x:0:0:rot:/rot:/bin/bash
[root@localhost ~]# grep 'rot' test.txt |sed 's/(rot)(.*)(/bin/bash)/321/'
/bin/bash:x:0:0:rot:/rot:rot
[root@localhost ~]# grep 'rot' test.txt |sed -r 's/(rot)(.*)(/bin/bash)/321/'
sed:-e 表示式 #1,字元 18:“s”的未知選項
[root@localhost ~]# grep 'rot' test.txt |sed -r 's/(rot)(.*)(/bin/bash)/321/'
/bin/bash:x:0:0:rot:/rot:rot

加-r  後()內的/bin/bash 也還需要脫意才可以;

-i 選項    直接替換字元,並且儲存原檔案裡面。使用i選項前,記得備份原檔案。

[root@localhost ~]# sed -r -i 's/([^:]+)(:.*:)([^:]+$)/321/' 1.txt 
[root@localhost ~]# cat 1.txt 
ff:bb:cc:dd:ee:aa

在sed命令中引入shell變數 http://www.linuxidc.com/Linux/2014-03/97896.htm

Linux下Shell程式設計——sed命令基本用法 http://www.linuxidc.com/Linux/2013-06/85526.htm

Unix文字處理工具之sed  http://www.linuxidc.com/Linux/2013-08/89315.htm

sed 高階用法 http://www.linuxidc.com/Linux/2014-09/106961.htm

sed命令詳解與範例 http://www.linuxidc.com/Linux/2014-11/109325.htm

本文永久更新連結地址http://www.linuxidc.com/Linux/2015-04/116309.htm


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