一、sed介紹
sed 一種流式編輯器。一個流式編輯器通常對來自輸入流(一個文件或者是管道的輸入)的文本進行轉換處理。在某些方面類似支持腳本編輯的編輯器,sed在多輸入情況下只開放一個通道工作,因此更加效率。sed與其他編輯器最大的區別在于,能對管道輸入的文本進行過濾處理。
二、sed工作機制
sed保持兩個數據緩沖區:主要活動的模式空間,以及輔助性的保持空間。兩者初始狀態都為空。
sed以對輸入的每一行文本執行下列循環操作的方式來運作:首先,sed從輸入流讀取一行數據,移走任何后面的換行符【注】,將讀取的一行放入模式空間。然后執行命令;每一條命令可以關聯一個地址:這些地址是一種條件碼,一條命令執行之前先確認條件是否符合才會被sed執行。
當執行完腳本末行命令時,如果沒有啟用 -n選項,打印模式空間里的文本到輸出流,在后面加上移走的換行符。然后讀取下一輸入行循環處理。所以sed在默認情況下不會對原文件改動。
如果沒有特別指令(比如'D')說明,在下一個循環開始前刪除模式空間的內容。而保持空間則可以保存循環之間的數據。
[注]:當有新內容追加到模式空間時,自動添加換行符
三、sed基本用法
用法:sed [OPTIONS…] 'scripts' FILE…
1.如何選定指定的行
sed中有一些指定行范圍的方法,用行號指定和用正則表達式指定,以及兩者結合起來指定。
-
空地址
匹配所有行;
-
N
匹配輸入中第N行;
-
$
匹配最后一行;
-
/PATTERN/,\#PATTERN#
匹配符合正則表達式的行;
-
/PATTERN/I
正則匹配時忽略大小寫
指定范圍表達方式
-
N1,N2
匹配N1到N2之間的行
-
0,/PATTERN/
從第一行開始匹配,直到符合正則表達式的那行
-
/PATTERN1/,/PATTERN2/
匹配符合兩正則表達式之間的行
-
FIRST~STEP
步進,匹配FISRT+n*STEP行,n為自然數。比如,1~2表示匹配奇數行
2.sed命令常用選項
選項 | 說明 |
-n | 取消模式空間內容的自動打印 |
-e | 多點編輯 |
-f | 指定腳步文件 |
-r | 支持擴展正則表達式 |
-i | 原文件編輯(慎用) |
3.sed編輯命令
1)d
刪除當前模式空間內容,立即開始下一循環(不打印任何內容)
~]$ sed '1,10d' test.txt #打印除1到10行外的內容
2)p
打印模式空間的內容;常與-n選項公用
~]$ sed -n '1~2p' test.txt #打印奇數行的內容
3)a \text
行后追加text文本;另起的一行
4)i \text
行前插入text文本;另起的一行
5)c \text
指定行替換為text文本
6)w /path/file
保存模式空間中的內容到指定文件
7)r /path/file
讀取文件內容到模式空間
8)=
為模式空間中的行打印行號
9)!
標記在地址后邊,表示地址取反
~]$ sed -n '1!p' text.txt #除第一行外全部打印
4.替換命令
s/REGEXP/REPLACEMENT/FLAGS
表達式中'/'可用其他單個字符替換
(一)REPLACEMENT中有特殊字符,代表特殊意義
1)&
表示查找到的內容
~]$ sed 's/.*/#&/' test.txt #為每一行開頭加上#
2)\L
將替換的內容都轉換成小寫字母,直到遇到U或者E。
3)\l
將下一個字符轉換成小寫字母。
4)\U
將替換的內容都轉換成大寫字母,直到遇到L或者E。
5)\u
將下一個字符轉換成大寫字母。
6)\E
停止L或者U的字母大小寫轉換。
(二)FLAGS
1)g
表示全行替換;默認只替換第一個匹配項
2)p
打印替換成功的行
3)w /path/file
保存替換成功的行到指定文件
例1,將/etc/fstab 文件中UUID轉為小寫,UUID行其他字母轉為大寫
$ sed -r 's/(^U.*)=(.*)/\L\1=\U\2/' /etc/fstab
例2,刪除/etc/fstab文件中所有以#開頭,后面至少跟一個空白字符的行的行首的#和空白字符
$ sed -r 's/^#[[:space:]]+//' /etc/fstab
原創文章,作者:cutemsyu,如若轉載,請注明出處:http://www.www58058.com/33170
文章從sed原理到常見用法,有理論有實踐,排版也很精美,建議對大標題使用字體加粗會更好一點哦。