最近看完了sed與awk(第二版)的sed部分,總結一下所學的東西,也算在記憶一遍。
1. 基本格式
sed [option] script filename
2. script: sed執行的指令碼,也就是sed執行的命令
格式:'[模式]過程'
指令:sed基本指令和sed高階指令,下面介紹
1> sed基本流程
d:刪除所有行,沒有位址,預設是整個檔案的所有行
1,4d:刪除1到4行
$d:刪除最後一行
/^$/d:刪除空行
/exp1/,/exp2/d:刪除從符合正規表示式exp1到符合正規表示式exp2的行
指令:可以是單個指令,也可以是一組指令(即在一行中應用多個指令)
分組指令格式:/exp1/
書上說:左大括號必須在行末,右大括號本身佔一行,且大括號後面不能有空格。但是我在gnu sed 4.2.1上測試,沒有這些限制。
3. sed基本命令
先讀取一行到模式空間,然後將指令碼中的每乙個指令(乙個接乙個地)應用到該行上,當到達指令碼底部時,即執行完所有的指令後,輸出模式空間內容,然後清除模式空間,然後讀入新行到模式空間,...,直到最後一行。
理解:a:sed是一行為單位進行處理的,這裡的「處理」就是執行所有指令碼中的指令。即讀入一行,執行所有的指令碼指令,輸出執行結果,然後再讀入一行,再執行所有的指令碼指令,再輸出執行結果;...
b:並不是將指令碼的一條指令應用到檔案所有的行上
c:前面指令處理的結果影響到後面的指令
d:指令碼指令只是對模式空間中的內容進行了處理,返回的結果也是模式空間中的內容,並沒有改變原始檔的內容,模式空間就是行快取器,保持空間是乙個臨時快取器,下面具體介紹
e:待新增
2>替換指令:s
格式:[addr]s/patten/replacement/flags
a:定界符:/。這裡使用『/』作為定界符,也可以用其他字元,換行符除外,當正則表示或替換模式中出現定界符時,用『/』來轉換
b:replacement中特殊字元:
&:表示patten的內容,即用於替換正規表示式的內容
/n:匹配patten中「/(」「/)」中的內容
/:轉義其他字元,如&, /。
3>刪除指令:d
刪除模式空間的內容,當模式空間為「空」時,就不會再有其他指令執行,所以刪除後sed會讀取新行,從頭再執行指令
4>追加:a;插入:i;更改:c
格式:[addr][a|i|c]/
text
a:『/』後的所有字元都包含在text內,包含前導空格,嵌入空格,換行符
當text是多行時,應在行最後加入『/』,表示續行。
b:追加到當前行之後,插入到當前行之前,替換匹配行所有字元、
c:a、i指令不會改變模式空間內容,即通過a、i命令新增的內容不會被其他指令使用
c指令改變模式空間內容
思考:a、i指令不改變模式空間內容,但是最後可以正常輸出,那麼a、i指令的內容暫時儲存在什麼地方呢?書中沒有介紹,待研究
5> 轉換指令:y
主要用途:大小寫轉換,但是是轉換模式空間所有的內容,不能只轉換某一些字串(如轉換某個單詞,單詞的轉換要用到sed高階指令)
6>列印指令:p
輸出當前模式空間內容,可以用它隨時檢視模式空間內容
輸出當前模式空間內容,並且讀入下一行內容,繼續執行n下面的指令,並沒有按照sed基本流程那樣,讀取新一行時從開始再執行所有指令碼指令,所以該指令改變了sed正常的流控制
8> 讀寫檔案指令:r、w
格式:[addr]r|w filename
a:addr必須是確定的行號,不能使行號範圍
b:r|w後有乙個空格,空格後的所有字元都屬於filename,包括前導空格、嵌入空格和換行符
c:r指令也不會影響模式空間(書中沒有說,但在gnu sed 4.2.1版本試驗得出)
明天再寫吧!
總結一下,可以歸納為一句話:
當然sed高階用法中可能回改變這一流程,改變的地方主要是在執行指令碼命令後。例如: 不輸出模式空間內容;不讀入下一行到模式空間等
sed的學習總結
在第二行上面插入newline,此操作只在虛擬空間內執行 heleo newline hideomo deiji halao yaoyingodng 12312412 312312jdasd 12312321 21321321313 yaoyingdong 192 sed s abc abcd te...
sed命令總結
1.刪除首字母問空的行 2.刪除第二到第八的所有行。3.編寫sed指令碼,替換與行匹配相同的內容,即將boby替換為 boby,但僅替換第二個boby為 boby.root localhost tmp cat test1.txt first web wqeqwe root localhost tmp...
sed 用法總結
sed n 1,3 p filename 列印1 3 行sed n if fi p filename 列印字元if和 fi之間的內容 sed e 1996 d filename 刪除除了含有 1996 的所有行 sed e y abc abc filename 把小寫的 abc轉換成大寫的 abc ...