2021-05-12 14:32:11
Linux文字處理三劍客之sed 基礎
2020-06-16 17:09:56
sed編輯器被稱作流編輯器(stream editor),和普通的互動式文字編輯器恰好相反。在互動式文字編輯器中(比如vim),你可以用鍵盤命令來互動式的插入、刪除或者替換資料中的文字。流編輯器則會自愛編輯器處理資料之前基於預習提供的一組規則來編輯資料流。
sed編輯器可以根據命令來處理資料流中的資料,這些命令要麼從命令列輸入,要麼儲存在一個命令檔案中。sed會執行下列操作:
(1)一次從輸入中讀取一行資料。
(2)根據所提供的編輯器命令匹配資料
(3)安裝命令修改流中的資料
(4)將新的資料輸出到STDOUT
在流編輯器將所有命令與一行資料匹配完畢後,它會讀取下一行資料並重複這個過程。在流編輯器處理完流中的所有資料行後,它就會終止。
由於命令是按順序逐行執行的,sed編輯器只需對資料流進行以便處理就可以完成編輯操作。這使得sed編輯器要比互動式編輯器快得多,可以快速完成對資料的自動修改。
用法
sed [option]… 'script' intputfile
1 常用選項
-n:不輸出模式空間內容到螢幕,既不自動列印
-e:多點編輯
-f:/PATH/SCRIPT_FILE:從指定檔案中讀取編輯指令碼
-r:支援使用擴充套件正規表示式
-i.bak:備份檔案並原處編輯
script:
"地址命令"
2 地址定界
(1)不給地址:對全文進行處理
(2)單地址:
#:指定的行
/pattern/:被此處模式所能夠匹配到的每一行
(3)地址範圍:
#,#
#,+#
/pat1/,/pat2/
#,/pat1/
(4)~:步進
1~2 奇數行
2~2 偶數行
3 基本編輯命令
d:刪除模式空間匹配的行
p:顯示模式空間中的內容
a[]text:在指定行後面追加文字,支援使用n實現多行追加
i[]text:在行前面插入文字
c[]text:替換行為單行或多行文字
w /path/somefile:儲存模式匹配的行至指定檔案
r /path/somefile:讀取指定檔案的文字至模式空間中匹配到的行後
= :為模式空間中的行列印行號
! :模式空間中匹配行取反處理
s/oldstr/newstr/:查詢替換,支援使用其它分隔符,s@@@,s###
替換標記:
g:行內全域性替換
p:顯示替換成功的行
w /PATH/TO/SOMEFILE:將替換成功的行儲存至檔案中
4 常用命令
(1)列印第N行
[root@local ~]# sed -n '2p' /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
(2)列印第N至M行
[root@local ~]# sed -n '1,4p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
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
(3)列印所有包含關鍵字string的行
[root@local ~]# sed -n '/root/p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
(4)列印從第N行開始到有關鍵字string 的行
[root@local ~]# sed -n '1,/root/p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
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
operator:x:11:0:operator:/root:/sbin/nologin
(5)顯示空行行號
[root@local ~]# sed -n '/^$/=' /etc/fstab
1
(6)在關鍵字行後追加文字
[root@local ~]# sed '/root/asuperman' /etc/passwd
root:x:0:0:root:/root:/bin/bash
superman
bin:x:1:1:bin:/bin:/sbin/nologin
[……]
operator:x:11:0:operator:/root:/sbin/nologin
superman
games:x:12:100:games:/usr/games:/sbin/nologin
[……]
(7)在關鍵字string行前追擊文字
[root@local ~]# sed '/root/isuperman' /etc/passwd
superman
root:x:0:0:root:/root:/bin/bash
[……]
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
superman
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
[……]
(8)替換行為單行或多行文字
[root@local ~]# sed '/root/csuperman' /etc/passwd
superman
bin:x:1:1:bin:/bin:/sbin/nologin
[……]
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
superman
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
[……]
(9)刪除指定行
[root@local ~]# sed '1,10d' /etc/passwd
或[root@local ~]# cat -n /etc/passwd |sed '1,10d'
11 games:x:12:100:games:/usr/games:/sbin/nologin
12 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
13 nobody:x:99:99:Nobody:/:/sbin/nologin
14 avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
(10)在指定行後追加文字
[root@local ~]# nl /etc/passwd |sed '2a tea'
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
tea
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
(11)在關鍵字追加文字
[root@local ~]# sed -n 's/root/&superman/p' /etc/passwd
rootsuperman:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/rootsuperman:/sbin/nologin
(12)在關鍵字前追擊文字
[root@local ~]# sed -n 's/root/superman&/p' /etc/passwd
supermanroot:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/supermanroot:/sbin/nologin
(13)全域性查詢替換
[root@local ~]# sed 's/UUID/hahaha/g' /etc/fstab
[……]
hahaha=227a3d28-7318-4a4d-8b1e-e076460506b8 / xfs defaults 0 0
hahaha=7ea2bade-f418-4d0a-93cd-b413406e604e /boot xfs defaults 0 0
hahaha=12e75d1f-a8e4-4663-afb7-a018beae1e52 swap swap defaults 0 0
(14)使用多個編輯器命令
[root@local ~]# sed -e 's/UUID/hahaha/g' -e 's/=/###/g' /etc/fstab
[……]
hahaha###227a3d28-7318-4a4d-8b1e-e076460506b8 / xfs defaults 0 0
hahaha###7ea2bade-f418-4d0a-93cd-b413406e604e /boot xfs defaults 0 0
hahaha###12e75d1f-a8e4-4663-afb7-a018beae1e52 swap swap defaults 0 0
(15)修改前備份
先把/etc/fstab複製到當前目錄下,以防止直接修改
[root@local ~]# cp /etc/fstab .
[root@local ~]# sed -i.bak 's/=/$$$$$/g' fstab
[root@local ~]# cat fstab fstab.bak
[……]
UUID$$$$$227a3d28-7318-4a4d-8b1e-e076460506b8 / xfs defaults 0 0
UUID$$$$$7ea2bade-f418-4d0a-93cd-b413406e604e /boot xfs defaults 0 0
UUID$$$$$12e75d1f-a8e4-4663-afb7-a018beae1e52 swap swap defaults 0 0
[……]
UUID=227a3d28-7318-4a4d-8b1e-e076460506b8 / xfs defaults 0 0
UUID=7ea2bade-f418-4d0a-93cd-b413406e604e /boot xfs defaults 0 0
UUID=12e75d1f-a8e4-4663-afb7-a018beae1e52 swap swap defaults 0 0
[root@local ~]#
(16)從檔案中讀取編輯命令
[root@local ~]# cat script1.sed
s/=/$$$$/
s/UUID/linuxidc/
[root@local ~]# sed -f script1.sed fstab
[……]
linuxidc$$$$227a3d28-7318-4a4d-8b1e-e076460506b8 / xfs defaults 0 0
linuxidc$$$$7ea2bade-f418-4d0a-93cd-b413406e604e /boot xfs defaults 0 0
linuxidc$$$$12e75d1f-a8e4-4663-afb7-a018beae1e52 swap swap defaults 0 0
本文永久更新連結地址:http://www.linuxidc.com/Linux/2017-07/145881.htm
相關文章