處理文本的工具sed
行編輯器:
sed
是一種流編輯器,它一次處理一行內容,處理時,把當前處理的行存儲在臨時緩沖區中,我們稱為“模式空間”
接著用sed命令處理緩沖區中的內容,處理完成后,把緩沖區的內容送往屏幕、接著處理以下一行,這樣不斷重復,直到文件末尾。
文件內容并沒有改變,除非你使用重定向存儲輸出。sed主要用來自動編輯一個或多個文件,簡化對文件的反復操作,編寫轉換程序等
還有一種模式叫做保持空間:sed工作機制是每次讀取一行文本至‘模式空間’中,在模式空間中完成處理,將處理結果輸出至標準輸出設備,在模式空間中處理一行內容后會繼續處理下一行,那么對于處理過的行可能還會做其它的處理,因此可以先把處理過的行‘導入’至保持空間中,如果需要后續處理的話,就在次‘導入’模式空間中處理,概念:模式空間就好比廚房,保持空間好比冰箱,廚房用作加工生產,冰箱負責,保存一些半成品材料。
保持空間支持一些高級的命令來運用到保持空間當中 :具體看最下面:高級編輯命令選項
sed用法
sed [選項] 可以跟多個選項 'script' [源文件] 可以跟多個文本
script: 地址定界編輯命令
,指明對文本做什么樣的操作
常用選項:
sed -n 不輸出模式空間中的內容自動打印
例如 ~]# sed -n '2p' /etc/passwd 加了-n選項只顯示出來定義的內容
p顯示模式空間中的內容
sed -e scropt1 -e scropt2 -e
scropt2 可以進行多點編輯
sed -f
/path/to/script_file 從指定的文件中讀取腳本并運行
sed -r
支持使用擴展正則表達式
sed -i 直接對源文件進行修改
例如 選項i sed -i.bak '10d' f1 對源文件操作的時候 做好備份文件
地址定界:抽取的區域
在不給地址的情況下,對全文進行處理
給單地址:
#
表示數字,指定的行
例如 ~]# sed -n '1p' f1
只顯示文本中的第1行
$ 最后一行
例如
~]# sed -n '$p' f1 只顯示文本中的最后的行
/模式/
被此處模式所能夠匹配到的每一行;可以是正則表達式
例如 ~]# sed -n '/root/p'
/etc/passwd 只匹配帶有關鍵字的搜索內容
地址范圍:
#1,#2
從#1行到#2行
例如 ~]# sed -n '1,4p'
/etc/passwd 只顯示文本中第1行到第4行的內容
#,+n
從#行開始,一直到向下的n行
例如 ~]# sed -n '4,8p' f1
只顯示文本中第4行開始到文本中第8行的內容
#,/模式/
從#行開始,到第一次被模式所匹配到的行結束,中間的所有行內容
例如 ~]# sed -n '2,/root/p'
/etc/passwd
/模式1/,/模式2/ 從第一次唄模式1匹配到的行開始,
到第一次被模式2匹配到的行結束,中間所有行內容
~ 步進,指定起始行,以及步長。 1~2 計數行 2-2 偶數行
例如
~]# sed -n '1~2p' file1 至顯示1的奇數行,1,3,5…..
例如 ~]# sed -n
'2~2p' file1 只顯示2的偶數行,2,4,6…..
編輯命令:
d :
刪除模式空間匹配的行
例如 ~]# sed '4d' f1 刪除第4行的匹配的行,
不是刪除源文件內容,輸出刪除而已
p : 顯示模式空間中的內容
例如 ~]# sed -n '4p' f1
配合-n選項不輸出文本內容為自動打印,p僅顯示第4行匹配到的內容
a \text :
在行后面追加文本,支持使用\n換行字符實現多行追加
例如 ~]# sed '/^1/a\xiaomage'
file1 我在開頭為數字1的行,追加內容到1之后的行后面
i \text :
在行前面插入文本,支持使用\n換行字符實現多行插入
例如 ~]# sed '/^1/i\xiaomage'
file1 同樣,使用i 在開頭數字為1的行,追加內容到1之前的行前面
c \text :
替換行為單行或多行文本
例如 ~]# sed '/^1/c\xiaomage' file1
將字符為1的行,替換成xiaomage內容
w /path/to/somefile
保存模式匹配的行至指定的文件
例如 ~]# sed '/^1/w /root/f1 ' file1
將字符開頭為1的 保存指定的路徑下,并命名
r /path/from/somefile
讀取指定文件的文本至模式空間中匹配到的行后
= 為模式空間中的行打印行號
! 模式空間中匹配行取反處理
s/正則表達式/替換的位置/
s///
查找替換,支持使用其他分隔符s@@@,s####
替換標記
g
行內全局替換
p 顯示替換成功的行
w w
/path/to/somefile 將替換成功的行保存至指定的文件
高級編輯命令:
h
把模式空間中的內容覆蓋至保持空間中
H 把模式空間中的內容追加至保持空間中
g
從保持空間取出數據覆蓋至模式空間
G 從保持空間取出內容追加至模式空間
x
把模式空間中的內容與保持空間中的內容進行互換
n 讀取匹配到的行的下一行覆蓋至模式空間
N
追加匹配到的行的下一行至模式空間
d 刪除模式空間中的行
D 刪除多行模式空間中的行首
注:命令功能可使用!取反, ;分好可用于分隔腳本
練習 1
1 刪除/etc/grub2.conf 文件中所有以空白開頭的行行首的空白字符
~]# sed -r
's@^[[:space:]]+@@' /etc/grub2.cfg
(命令選項,-r使用擴展表達式,查找替換,分隔符,開頭為空白的行
+匹配最少一次,后面跟路徑)
2 刪除/etc/fstab文件中所有以#開頭,后面至少跟一個空白字符的行的行首的#和空白字符
~]# sed
's@^#[[:space:]]\+@@' /etc/fstab
(命令選項, -r 使用擴展表達式,查找替換分隔符,^開頭為#空白符的
匹配前面的字符至少一次)
3 在/root/install.log 每一行行首增加#號
~] # sed -r
's@(.*)@#\1@g'
/root/install.log
(命令選項,-r使用擴展表達式,s查找替換分隔符以分組.*任意字符\1#g替換分組內匹配到的字符)
~] #
sed 's@^@#@' /root/install.log
(命令選項,s查找替換以^開頭為#的字符,后面跟路徑)
4
在/etc/fstab 文件中不以#開頭的行的行首增加#號
~] # sed 's@^[^#]@#&@' /etc/fstab
(命令選項,s查找替換開頭^[^不以#]中增加#號, 后面跟路徑)
5 處理/etc/fstab路徑,使用sed 命令取出其目錄名和基名
~] #echo /etc/sysconfig/ |sed -r
's#[^/]+/?$##' 目錄名
~] #echo "/etc/fst/sd" | sed -r 's@(.*/)([^/]+/?)$@\1@'
6 利用sed 取出ifconfig 命令中本機的ipv4地址
~] #ifconfig|sed -n 2p |sed -e
's/.*addr://' -e 's/ B.*//'
7 統計 centos 安裝光盤中package 目錄下的所有rpm文件的以.分隔倒數第二個字段的重復次數
~]# ls *.rpm |rev
|cut -d. -f2 |rev|sort |uniq -c
原創文章,作者:小馬哥,如若轉載,請注明出處:http://www.www58058.com/32497