sed 是一種在線的、非交互式的流編輯器,它一次處理一行內容。處理時,把當作前處理的行存儲在臨時緩存區中,成爲「模式空間」(pattern space),接着用sed命令處理緩存區中的內容,處理完成後,把緩存區的內容送往屏幕。接着處理下一行,這樣不斷從新,直到文件末尾,文件內容並無改變,除非你使用重定向存儲輸出。sed主要來自動編輯一個或多個文件,簡化問文件的反覆操做,編寫轉換程序等;linux
sed [options] 'command' file(s) sed [options] -f scriptfile file(s)
注:nginx
sed和grep不同,無論是否找到指定的模式,它的退出狀態都是0,只有當命令存在語法錯誤時,sed的退出狀態纔是非0正則表達式
與grep同樣,sed在文件中查找模式時也可使用正則表達式(RE)和各類原字符,正則表達式是包括斜槓間的模式,用於查找和替換,如下是sed支持的元子浮。express
使用基本元字符集 ^, $, ., *, [], [^], \< \>,\(\),\{\} 使用擴展元字符集 ?, +, { }, |, ( ) 使用擴展元字符的方式: \+
sed -r
# sed -r '' /etc/passwd # sed -r 'p' /etc/passwd # sed -r -n 'p' /etc/passwd # sed -r -n '/root/p' /etc/passwd # sed -r 's/root/alice/' /etc/passwd # sed -r 's/root/alice/g' /etc/passwd # sed -r 's/root/alice/gi' /etc/passwd # sed -r '/root/d' /etc/passwd # sed -r '\#root#d' /etc/passwd
==========================================vim
[root@liwei ~] vim a.txt /etc/abc/456 etc [root@liwei ~]# sed -r '//etc/abc/456/d' a.txt sed:-e 表達式 #1,字符 0:no previous regular expression [root@liwei ~]# sed -r '/\/etc\/abc\/456/d' a.txt /etc/abc/456 [root@liwei ~]# sed -r '\#/etc/abc/456#d' a.txt /etc/abc/456 [root@liwei ~]# sed -r 's#/etc/abc/456#/dev/sda1#'
==========================================緩存
①地址(定址)ssh
地址用於決定對哪些行進行編輯,地址形式能夠是數字、正則表達式或兩者的結合,若是沒有指定地址,sed將處理輸入文件中的全部行。編輯器
# sed -r 'd' /etc/passwd # sed -r '3d' /etc/passwd # sed -r '1,3d' /etc/passwd # sed -r '/root/d' /etc/passwd # sed -r '/root/,5d' /etc/passwd # sed -r 's/root/alice/g' /etc/passwd # sed -r '/^adm/,20d' /etc/passwd //刪除到第20行
# sed -r '/^adm/,+20d' /etc/passwd //再刪除20行
# sed -r '2,5d' /etc/passwd # sed -r '/root/d' /etc/passwd # sed -r '/root/!d' /etc/passwd # sed -r '1~2d' /etc/passwd //刪除全部奇數行 odd-numbered
# sed -r '0~2d' /etc/passwd //刪除全部偶數行 even-numbered
②sed命令spa
sed 命令告訴sed對指定行進行任何操做,包括打印、刪除、修改等;3d
命令 功能 a //在當前行後添加一行或多行
c //用新文本修改(替換)當前行中的文本
d //刪除行
i //在當前行以前插入文本
l //列出非打印字符
p //打印行
n //讀入下一出入行,並從下一行命令而不是第一條命名開始對其的處理
! //對所選行之外的全部行應用命名
s //用一個字符串替換另外一個,(替換標誌)
g //全局(結合命令s)
i //忽略大小寫(結合命令s)
r //從文件中讀
w //將行寫入文件
y //將字符裝換爲另外一字符(不支持正則表達式)
h //把模式空間裏的內容複製到暫存緩存衝(覆蓋)
H //把模式空間裏的內容追加到暫存緩衝區
g //取出暫存緩衝區的內容,將其複製到模式空間,覆蓋該處原有內容
G //取出暫存緩衝區的內容,將其複製到模式空間,追加在原有內容
x //交換暫存緩衝區與模式空間的內容
③選項
選項 功能 -e //容許多項編輯
-f //指定sed腳本文件名
-n //取消默認的輸出
-i //inplace,就地編輯
-r //支持擴展元字符
# sed -r '/north/p' datafile # sed -r -n '/north/p' datafile
# sed -r '3d' datafile # sed -r '3{d;}' datafile # sed -r '3{d}' datafile
# sed -r '3,$d' datafile # sed -r '$d' datafile # sed -r '/north/d' datafile # sed -r '/sout/d' datafile
# sed -r 's/west/north/g' datafile # sed -r 's/^west/north/' datafile # sed -r 's/[0-9][0-9]$/&.5/' datafile //&表明在查找串中匹配到的內容
# sed -r 's/Hemenway/Jones/g' datafile # sed -r 's/(Mar)got/\1ianne/g' datafile # sed -r 's#3#88#g' datafile
# sed -r '/Suan/r /etc/newfile' datafile # sed -r '2r /etc/hosts' a.txt # sed -r '/2/r /etc/hosts' a.txt
# sed -r '/north/w newfile' datafile # sed -r '3,$w /new1.txt' datafile
# sed -r '2a\1111111111111' /etc/hosts # sed -r '2a\1111111111111\
> 222222222222\ > 333333333333' /etc/hosts
# sed -r '2i\1111111111111' /etc/hosts # sed -r '2i111111111\
> 2222222222\ > 3333333333' /etc/hosts
# sed -r '2c\1111111111111' /etc/hosts # sed -r '2c\111111111111\
> 22222222222\ > 33333333333' /etc/hosts
# sed -r '/eastern/{ n; d }' datafile # sed -r '/eastern/{ n; s/AM/Archile/ }' datafile
# sed -r '1h;$G' /etc/hosts # sed -r '1{h;d};$G' /etc/hosts # sed -r '1h; 2,$g' /etc/hosts # sed -r '1h; 2,3H; $G' /etc/hosts
# sed -r '4h; 5x; 6G' /etc/hosts
# sed -r '3d' /etc/hosts # sed -r '3!d' /etc/hosts
# sed -r -e '1,3d' -e 's/Hemenway/Jones/' datafile # sed -r '1,3d; s/Hemenway/Jones/' datafile # sed -r '2s/WE/1000phone/g; 2s/Gray/YYY/g' datafile # sed -r '2{s/WE/1000phone/g; s/Gray/YYY/g}' datafile
//刪除配置文件中#號註釋行
sed -ri '/^#/d' file.conf sed -ri '/^[ \t]*#/d' file.conf
//刪除配置文件中//號註釋行
sed -ri '\Y^[ \t]*//Yd' file.conf
//刪除無內容空行
sed -ri '/^[ \t]*$/d' file.conf
//刪除註釋行及空行:
# sed -ri '/^[ \t]*#/d; /^[ \t]*$/d' /etc/vsftpd/vsftpd.conf # sed -ri '/^[ \t]*#|^[ \t]*$/d' /etc/vsftpd/vsftpd.conf # sed -ri '/^[ \t]*($|#)/d' /etc/vsftpd/vsftpd.conf
//修改文件:
# sed -ri '$a\chroot_local_user=YES' /etc/vsftpd/vsftpd.conf # sed -ri '/^SELINUX=/cSELINUX=disabled' /etc/selinux/config # sed -ri '/UseDNS/cUseDNS no' /etc/ssh/sshd_config # sed -ri '/GSSAPIAuthentication/cGSSAPIAuthentication no' /etc/ssh/sshd_config
//給文件行添加註釋:
# sed -r '2,6s/^/#/' a.txt # sed -r '2,6s/(.*)/#\1/' a.txt # sed -r '2,6s/.*/#&/' a.txt
//&匹配前面查找的內容
# sed -r '3,$ s/^#*/#/' a.txt //將行首零個或多個#換成一個#
# sed -r '30,50s/^[ \t]*#*/#/' /etc/nginx.conf # sed -r '2,8s/^[ \t#]*/#/' /etc/nginx.conf
# var1=11111 # sed -ri '3a$var1' /etc/hosts # sed -ri "3a$var1" /etc/hosts # sed -ri 3a$var1 /etc/hosts # sed -ri "$a$var1" /etc/hosts # sed -ri '$a'"$var1" /etc/hosts # sed -ri "\$a$var1" /etc/hosts