sed 處理文本工具
一、概述
Stream EDitor,行編輯器
sed是一種流編輯器,它一次處理一行內容。處理時,把當前處理的行存儲在臨時緩沖區中,稱為“模式空間”(pattern space),接著用sed命令處理緩沖區中的內容,處理完成后,把緩沖區的內容送往屏幕。接著處理下一行,這樣不斷重復,直到文件末尾。文件內容并沒有改變,除非你使用重定向存儲輸出。sed主要用來自動編輯一個或多個文件,簡化對文件的反復操作,編寫轉換程序等
sed 是一種非交互式的文本編輯器,通過給定條件自動的逐行去處理文件。
grep是用來檢索關鍵字的,sed 卻是搜索匹配處理文本工具。
二、功能
sed 所具有的功能:數據的替換,刪除,新增等,這里的數據可以是一些關鍵字,也可以是一些特定的行。
三、語法結構及用法:
1.語法結構:sed [option]… 'script' inputfile…
2.常用選項:
-n:不輸出模式空間內容的自動打印(靜默模式)
-e: 多點編輯,指定多腳本編輯
-f /PATH/TO/SCRIPT_FILE: 從指定文件中讀取編輯腳本并運行。
-r: 支持使用擴展正則表達式
-i: 原處編輯(直接修改源文件) -i.back(備份)
3.地址界定(抽取的域):
(1) 不給地址:對全文進行處理
(2) 單地址:
#: 表示數字,指定的行
$:最后一行
/pattern/:被此處模式所能夠匹配到的每一行
(3) 地址范圍:
#1,#2 :從#1行,到#2行
#,+n:從#行開始,一直到向下的n行
/pat1/,/pat2/:從第一次被pat1匹配到的行開始,到第一次被pat2匹配到的行結束,中間的所有行;
#,/pat1/: 從#行開始,到第一次被pat1匹配到的行結束,中間的所有行。
(4) ~:步進,指定起始行及步長。
1~2 奇數行
2~2 偶數行
4.編輯命令:
d: 刪除模式空間匹配的行
p: 打印模式空間中的內容
a\text:在行后面追加文本;支持使用\n實現多行追加
i\text:在行前面插入文本;支持使用\n實現多行插入
c\text:替換行為單行或多行文本
w /path/to/somefile: 把指定的內容另存至/path/to/somefile路徑所指定的文件中。
r /path/from/somefile:在文件的指定位置插入另一個文件的所有內容,完成文件合并。
= : 為模式空間中的行打印行號
! :模式空間中匹配行取反處理
注意:這里添加或替換的內容,只是在模式空間中改變,原文件并沒有被修改,如果要修改源文件 加 -i 選項(慎用)
5.查找替換(很重要):
s///:查找替換,支持使用其它分隔符:s@@@,s###
如:s/string1/string2/ 用string2 替換string1,string 可以是字符串也可以是正則表達式。
替換標記:
g: 行內全局替換
p: 顯示替換成功的行
w /PATH/TO/SOMEFILE :將替換成功的行保存至文件中
6.sed示例:
sed‘2p’ /etc/passwd
sed–n ‘2p’ /etc/passwd
sed–n ‘1,4p’ /etc/passwd
sed–n ‘/root/p’ /etc/passwd
sed–n ‘2,/root/p’ /etc/passwd從2行開始
sed-n ‘/^$/=’ file 顯示空行行號
sed–n –e ‘/^$/p’ –e ‘/^$/=’ file
sed‘/root/a\superman’ /etc/passwd行后
sed‘/root/i\superman’ /etc/passwd行前
sed‘/root/c\superman’ /etc/passwd代替行
sed‘/^$/d’ file 刪除空行
sed‘1,10d’ file
nl /etc/passwd| sed‘2,5d’
nl /etc/passwd| sed‘2a\tea’
sed's/test/mytest/g' example
sed–n‘s/root/&superman/p’ /etc/passwd單詞后
sed–n‘s/root/superman&/p’ /etc/passwd單詞前
sed-e ‘s/dog/cat/’ -e ‘s/hi/lo/’ pets 多次處理
sed–i.bak ‘s/dog/cat/g’ pets
7.保持空間及高級命令
sed 除了“模式空間”(pattern space),還有一個“hold space”的內存空間,稱之為 保持空間。
所謂保持空間,就是,對于模式空間處理過的行,可能還有其他的處理,因此可以先把處理過的行“傳送”至保存空間,然后再后續的處理中再次“傳送”回模式空間中。 這就類似于加工車間和倉庫的概念,好比模式空間為加工車間,保持空間為倉庫,不過這里的倉庫存放的都是些半成品的產品。
高級編輯命令:
h: 把模式空間中的內容覆蓋至保持空間中
H:把模式空間中的內容追加至保持空間中
g: 從保持空間取出數據覆蓋至模式空間
G:從保持空間取出內容追加至模式空間
x: 把模式空間中的內容與保持空間中的內容進行互換
n: 讀取匹配到的行的下一行覆蓋至模式空間
N:追加匹配到的行的下一行至模式空間
d: 刪除模式空間中的行
D:刪除當前模式空間開端至\n的內容(不在傳至標準輸出),放棄之后的命令,但是對剩余模式空間重新執行sed
示例:
sed -n 'n;p' FILE
sed '1!G;h;$!d' FILE
sed '$!N;$!D' FILE
sed '$!d' FILE
sed ‘G’ FILE
sed ‘g’ FILE
sed ‘/^$/d;G’ FILE
sed 'n;d' FILE
sed -n '1!G;h;$p' FILE
練習:
1、刪除/etc/grub2.cfg文件中所有以空白開頭的行行首的空白字符
2、刪除/etc/fstab文件中所有以#開頭,后面至少跟一個空白字符的行的行首的#和空白字符
3、在/root/install.log每一行行首增加#號
4、在/etc/fstab文件中不以#開頭的行的行首增加#號
5、處理/etc/fstab路徑,使用sed命令取出其目錄名和基名
過程分析如下
6、利用sed 取出ifconfig命令中本機的IPv4地址
7、統計centos安裝光盤中Package目錄下的所有rpm文件的以.分隔倒數第二個字段的重復次數
總結與感悟:
1.通過對sed的學習,知道了sed相對于grep的功能更加強大。
區別:
grep只是一個文本過濾工具,作用就是根據用戶指定的過濾條件對目標文件逐行進行匹配檢查,打印匹配到的行。
sed是一種非交互式的文本編輯器(通過給定的條件自動逐行的去處理文件),grep只是用來檢索條件關鍵字的,而sed是搜索匹配處理文本工具,功能可以實現數據的替換、刪除、新增等,更加強大。
2.在處理一些題目時,可以采用的思路方法:
對目標文件利用擴展的正則表達式,進行分組處理,用組表示出所有的內容,然后把想要的內容用前面的分組替換。
注意 .* 的靈活應用,轉義符 \ 的使用(在.和()中使用)以及匹配次數的靈活應用 \+
原創文章,作者:zhumengxiaotao,如若轉載,請注明出處:http://www.www58058.com/32745