大多數(shù)情況下,對于文件內容的修改需要依賴交互式的軟件來實現(xiàn),例如vim修改文件的內容則是依賴光標的移動和修改操作來完成對文件某一處內容的修改。然而,在linux操作系統(tǒng)中,也存在一種非交互式的方法來修改文件內容,通過發(fā)送特殊的指令給終端使其完成對特定內容文件的修改。
sed(Stream editor) 正是一種非交互的流式編輯器。sed 支持修改一個輸入流(文件或管道)中的文本或字段的值,且因為只會對輸入的流文件進行一次處理,因此 sed 的工作效率要比其他的編輯器更加高效。而能夠從管道(Pipeline)中獲取過濾輸入流,這也是sed相比其他編輯器的顯著區(qū)分。
語法
sed [OPTION]... {script-only-if-no-other-script} [input-file]...
參數(shù)含義
-n, --quiet, --silent: 抑制命令執(zhí)行過程中的打印信息
-e script: 指定的腳本中的命令將被執(zhí)行
-f script-file: 指定的腳本文件中是sed的編輯命令
--follow-symlinks: 對于鏈接文件,替換的時候源文件也會進行替換
-i[SUFFIX]: 編輯文件進行替換(如果提供了SUFFIX,則進行備份)。默認沒有指定 -i 的情況下,sed只將指令的結果打印到終端,不會修改文件的內容。
-c, --copy: 使用-i選項的時候用復制代替重命名
--posix: 禁用GUN擴展
-r: 使用擴展正則表達式
替換標記
g: 替換每行中匹配到的所有字符
p: 打印被sed程序處理過的行
d: 指定行將被刪除
s: 替換指定字符串
詳細用法
- 刪除文件中指定的行
#wc -l /tmp/passwd
39 /tmp/passwd
#sed -i '11,39d' /tmp/passwd # 刪除11-39行的記錄 && 指令-i后才會修改文件
#wc -l /tmp/passwd
10 /tmp/passwd
- 刪除文件的最后一行
#sed -i '$d' /tmp/passwd
#wc -l /tmp/passwd
9 /tmp/passwd
- 刪除文件中的匹配行
#sed -i '/nologin$/d' /tmp/passwd # nologin$ 表明匹配以nologin結尾的行; 對應的 ^nologin 表明以nologin為首的行
#wc -l /tmp/passwd
4 /tmp/passwd
- 刪除輸入流中的空行
#sed -i '/^$/'d /tmp/passwd
- 替換一行中的第一個匹配到的字符串
#cat -n /tmp/passwd
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8 halt:x:7:0:halt:/sbin:/sbin/halt
9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10 operator:x:11:0:operator:/root:/sbin/nologin
#sed -n 's/mail/exchange/p' /tmp/passwd
exchange:x:8:12:mail:/var/spool/mail:/sbin/nologin
- 替換一行中所有匹配到的字符串
#sed -n 's/mail/exchange/gp' /tmp/passwd
exchange:x:8:12:exchange:/var/spool/exchange:/sbin/nologin
- 從每行匹配到的第2處開始替換
#sed -n 's/mail/MAIL/2p' /tmp/passwd
mail:x:8:12:MAIL:/var/spool/mail:/sbin/nologin
- 在指定行前增加一條記錄
說明: 使用sed對文件進行插入內容時,僅對有行數(shù)的文件有效;類似于空文件(沒有行記錄),插入操作無效
#sed '2 i\*********************** ' /tmp/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
- 在指定行后增加一條記錄
#sed '2 a\*********************** ' /tmp/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
- 通過管道接收上一條命令的輸出并修改命令輸出結果
#echo $LANG
en_US.UTF-8
#echo $LANG | sed 's/en_US/zh_CN/'
zh_CN.UTF-8
- 注釋文件中的所有行
#sed -i 's/^/#/' /tmp/passwd
#cat /tmp/passwd
#root:x:0:0:root:/root:/bin/bash
#sync:x:5:0:sync:/sbin:/bin/sync
#shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
#halt:x:7:0:halt:/sbin:/sbin/halt
- 刪除文件中每行的第一個字符
#sed -i 's/^.//1' /tmp/passwd
#cat /tmp/passwd
root:x:0:0:root:/root:/bin/bash
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
- 根據(jù)匹配到的內容注釋指定的行
#sed -n 's/root/#root/p' /tmp/passwd
#root:x:0:0:root:/root:/bin/bash