2021-05-12 14:32:11
sed命令的基本使用方法
命令格式解析
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
相關文章