學習sed總結

2021-06-16 05:52:13 字數 2094 閱讀 8632

最近看完了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 ...