描述:
sed是Stream EDitor(行編輯器)的簡寫,是一種流編輯器,它一次處理一行內容。處理時,把當前處理的行存儲在臨時緩沖區中,稱為“模式空間”(pattern space ),接著用sed 命令處理緩沖區中的內容,處理完成后,把緩沖區的內容送往屏幕。接著處理下一行,這樣不斷重復,直到文件末尾。文件內容并沒有改變,除非你使用重定向存儲輸出。Sed 主要用來自動編輯一個或多個文件, 簡化對文件的反復操作, 編寫轉換程序等。
用法:
sed [option]… ‘script' inputfile…
常用選項:
-n :不輸出模式空間內容的自動打印
示例:僅列出/etc/passwd 文件內的第5-7行
[root@localhost ~]# nl /etc/passwd |sed -n '5,7p' 5lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 6sync:x:5:0:sync:/sbin:/bin/sync 7shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
-e: 多點編輯
示例:處理/etc/fstab 或/etc/fstab/,使用sed命令取出其基名
[root@localhost ~]# echo "/etc/fstab" |sed -r -e 's@/$@@' -e 's@/.*/@@' fstab [root@localhost ~]# echo "/etc/fstab/" |sed -r -e 's@/$@@' -e 's@/.*/@@' fstab
-f / PATH/TO/SCRIPT_FILE : 從指定文件中讀取編輯腳本
-r: 支持使用擴展正則表達式
示例:處理/etc/fstab 路徑,使用sed命令取出其目錄名
[root@localhost ~]# echo "/etc/fstab/" |sed -r 's@[^/]+/?$@@' /etc/
-i: 原處編輯 (危險操作,不建議使用)
script:地址命令
(1) 不給地址:對全文進行處理
(2) 單地址:
#: 指定的行
/pattern/ :被此處模式所能夠匹配到的每一行
(3) 地址范圍:
#,#
#,+#
/pat1/,/pat2/
#,/pat1/
(4) ~ :步進
1~2 奇數行
2~2 偶數行
編輯命令:
d: 刪除模式空間匹配的行
示例:將/etc/passwd 的內容列出并打印行號,同時刪除第2-5行
[root@localhost ~]# nl /etc/passwd |sed '2,5d' 1root:x:0:0:root:/root:/bin/bash 6sync:x:5:0:sync:/sbin:/bin/sync 7shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
p: 顯示模式空間中的內容
示例:將第2行打印到屏幕上
[root@localhost ~]# nl /etc/passwd |sed '2p' 1root:x:0:0:root:/root:/bin/bash 2bin:x:1:1:bin:/bin:/sbin/nologin 2bin:x:1:1:bin:/bin:/sbin/nologin 3daemon:x:2:2:daemon:/sbin:/sbin/nologin
a \text :在行后面追加文本;支持使用\n 實現多行追加
示例:在第2行后加上“drink tea”字樣
[root@localhost ~]# nl /etc/passwd |sed '2a drink tea' 1root:x:0:0:root:/root:/bin/bash 2bin:x:1:1:bin:/bin:/sbin/nologin drink tea 3daemon:x:2:2:daemon:/sbin:/sbin/nologin
i \text :在行前面插入文本;支持使用\n 實現多行插入
示例:在第2行前加上“drink tea”字樣
[root@localhost ~]# nl /etc/passwd |sed '2i drink tea' 1root:x:0:0:root:/root:/bin/bash drink tea 2bin:x:1:1:bin:/bin:/sbin/nologin
c \text :替換行為單行或多行文本
示例:將第2-5行的內容替換成為“NO 2-5 number”
[root@localhost ~]# nl /etc/passwd |sed '2,5c NO 2-5 number' 1root:x:0:0:root:/root:/bin/bash NO 2-5 number 6sync:x:5:0:sync:/sbin:/bin/sync
w /path/to/somefile: 保存模式匹配的行至指定文件
示例:將第5-7行保存到/root/f1文件中
[root@localhost ~]# nl /etc/passwd |sed '5,7w/root/f1' [root@localhost ~]# cat f1 5lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 6sync:x:5:0:sync:/sbin:/bin/sync 7shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
r /path/from/somefile :讀取指定文件的文本至模式空間中匹配到的行后
=: 為模式空間中的行打印行號
[root@localhost ~]# sed -n '/^$/=' /etc/issue 顯示空白行的行號 3
!: 模式空間中匹配到的行取反處理
[root@localhost ~]# sed -n '/^$/!=' /etc/issue 除空白行以外的行顯示行號 1 2
s/// : 查找替換, 支持使用其它分隔符,s@@@ ,s###
示例:刪除/etc/grub2.cfg文件中所有以空白開頭的行行首的空白字符
[root@localhost ~]# sed 's@^[[:space:]]\+@@g' /etc/grub2.cfg # # DO NOT EDIT THIS FILE if [ -s $prefix/grubenv ]; then load_env fi
v: 替換標記:
g: 行內全局替換
p: 顯示替換成功的行
[root@localhost ~]# sed -e's@^#@@p' /etc/fstab 顯示替換成功的行 /etc/fstab /etc/fstab Created by anaconda on Sun Aug 7 06:26:08 2016 Created by anaconda on Sun Aug 7 06:26
w: /PATH/TO/SOMEFILE :將替換成功的行保存至文件中
[root@localhost ~]# sed 's@^#@@w/root/f3' /etc/fstab 將替換成功的行保存至/root/f3文件中
[root@localhost ~]# cat f3 /etc/fstab Created by anaconda on Sun Aug 7 06:26:08 2016 Accessible filesystems, by reference, are maintained under '/dev/disk' See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
高級編輯命令:
h: 把模式空間中的內容覆蓋至保持空間中
H: 把模式空間中的內容追加至保持空間中
g: 從保持空間取出數據覆蓋至模式空間
G: 從保持空間取出內容追加至模式空間
x: 把模式空間中的內容與保持空間中的內容進行互換
n: 讀取匹配到的行的下一行覆蓋至模式空間
N: 追加匹配到的行的下一行至模式空間
d: 刪除模式空間中的行
D: 刪除 當前模式空間開端至\n 的內容(不在傳至標準輸出),放棄之后的命令,但是對剩余模式空間重新執行sed
事先準備好的文件:
[root@localhost ~]# cat f1 1 2 3 4 5 6 7 8 9 10
1,sed -n 'n;p' FILE
[root@localhost ~]# sed -n 'n;p' f1 顯示偶數行 2 4 6 8 10
2,sed '1!G;h;$!d' FILE
[root@localhost ~]# sed '1!G;h;$!d' f1 逆序顯示 10 9 8 7 6 5 4 3 2 1
3,sed '$!N;$!D" f1
[root@localhost ~]# sed '$!N;$!D' f1 只顯示最后兩行 9 10
4,sed '$!d' FILE
[root@localhost ~]# sed '$!d' f1 只顯示最后一行 10
5,sed ‘G’ FILE
[root@localhost ~]# sed 'G' f1 在每一行的后面添加一個空白行 1 2 3 4 5 6 7 8 9 10
6,sed ‘g’ FILE
[root@localhost ~]# sed 'g' f1 顯示10個空白行
7,sed ‘/^$/d;G’ FILE
[root@localhost ~]# sed '/^$/d;G' f1 顯示的效果和第5題一樣,但不同之處是: 1 先將文件內的所有空白行刪除,然后在每一行的后面添加一個空白行 2 3
8,sed 'n;d' FILE
[root@localhost ~]# sed 'n;d' f1 顯示基數行 1 3 5 7 9
9,sed -n '1!G;h;$p' FILE
[root@localhost ~]# sed -n '1!G;h;$P' f1 顯示最后一行 10
總結:
1,sed工具作為文本處理三劍客中的一員,體現了其強大的功能,在處理多文件和寫腳本中的應用是很個廣泛的,需多加練習,才能靈活掌握其用法
2,以行為單位的新增/刪除功能,替換/顯示功能,‘s/要被替換的字符串/新的字符串/g'功能是經常用到的,需記憶并多加練習才能熟練掌握
原創文章,作者:pingsky,如若轉載,請注明出處:http://www.www58058.com/32121