sed的高階應用

2021-06-27 13:52:39 字數 2572 閱讀 5672

一、sed簡介

sed是面向流的行編輯器,所謂面向流,是指接受標準輸入的輸入,輸出內容到標準輸出上。sed和早期的ed有關,其實在sed中的很多命令,都有ed的影子。

二、sed基本用法

sed可以支援基本正規表示式,sed的執行:

sed [-n][-e] 'command' file(s)

sed [-n] -f scriptfile file(s)

sed的命令command格式:

[address[,address]][!]command [arguments]
sed的address是用行號來標誌的,比如'1'表示第一行,'1,5'表示1-5行,也可以用pattern來表示address,這是由正規表示式所支援的。command是應用於它前面所有address上的,如果address為空,那預設就是所有行!

sed指令碼結尾有很多有趣的特性,比如:自動輸出pattern中的內容,自動讀入新行到pattern space中,自動跳回指令碼開始處(有點類似於其他語言中的loop)。

三、sed命令總結

+ :::label,標誌乙個label,用於b/t的跳轉

+ =:[address]= 列印出行號

+ b:[address[,address]]b[label] 條件分支語句

+ c:[address[,address]]c\ 替換內容

+ g:[address[,address]]g 將hold space中的內容拷貝到pattern space中,原來pattern space裡的內容清除

+ h:[address[,address]]h 將pattern space中的內容拷貝到hold space中,原來的hold space裡的內容被清除

+ i:[address]i\ 在address行的前面插入文字,和a反義

+ l:[address[,address]]l 列印pattern space中的內容,不可列印字元列印出ascii

+ p:[address[,address]]p 列印出pattern space中的內容

+ p:[address[,address]]p 列印出multiline pattern space中的第一行

+ q:[address]q 碰到address行時退出sed script

+ s:[address[,address]]s/pattern/replace/[flag] 將pattern替換成replace.flag:

+ n:替換第n個出現的pattern,預設是第乙個出現的pattern

+ g:全部替換pattern

+ p:如果替換成功則列印

+ w file:將替換的行寫入到檔案裡

+ t:[address[,address]]t [label] 如果替換成功則跳轉

+ w:[address[,address]]w file 將pattern中的內容追加寫到file檔案

+ x:[address[,address]]x 交換hold space和pattern space的內容

+ y:[address1[,address2]]y/abc/xyz/ 將abc轉換為對應的xyz

四、高階應用

1、multiline pattern space

由於sed的正規表示式不能支援段的概念,所以在應用時會存在諸多限制,比如搜尋的詞或句子是跨行的,那麼用一般的方法就很難解決,perl能夠支援段,perl的正規表示式的修飾符s可以跨行。所以sed引入了「多行模式空間」的概念,模式空間是sed用來處理問題的乙個buffer,sed的命令基本都是對該buffer的操作,除了hold space外!

n/p/d命令用於multiline pattern,當然其他操作於pattern space的命令也可以操作multiline pattern,只不過效果是不一樣的!n命令讀入新行,形成multiline pattern,而n命令只是先輸出pattern space中的內容,再讀入新行並替換掉pattern space中原來存在的行。d命令刪除multiline pattern中的第一行,但並不自動讀入新行,而d命令則是將pattern space中的所有內容都刪除,並讀入新行到pattern space中去。p命令列印multiline pattern中的第一行,p命令列印所有行,p/p命令用於當輸出被遮蔽(supressed)或者遇到刪除d/d但又需要列印出被刪除的內容或者控制流程不能到達指令碼結尾。

2、hold space

為了處理更複雜的應用,單一的pattern space不能滿足要求,因此引入hold space,它其實是一塊temp buffer,作為pattern space的臨時儲存用的。命令g/g/h/h/x用於在兩種型別的buffer之間的資訊傳遞!

3、高階流程控制命令

b/t兩個命令可以用於跳轉,我們在指令碼中用命令":label"來建立標籤後,然後就可以跳轉過來,這樣可以形成do{}while()式的迴圈結構。程式語言中一般都會支援順序/條件/迴圈等流程控制。所以sed已經具有了一般程式語言的雛形了,可以做一些很複雜的事情。

sed高階用法

echo mmj evan df sed s 2 g 表示式含義s 表示替換命令 表示第乙個引號前的內容 表示兩引號之間的內容 表示引號後的內容 2表示第二對括號裡面的內容 輸出結果 evan同理 echo mmj evan df sed s 1 g 輸出結果為 mmj批量修改 echo excut...

sed高階指令

n命令簡單來說就是提前讀取下一行,覆蓋模型空間前一行,然後執行後續命令。然後再讀取新行,對新讀取的內容重頭執行sed 從test檔案中取出偶數行 root localhost cat test this is 1 this is 2 this is 3 this is 4 this is 5 roo...

sed 命令的高階用法

d 刪除 p 顯示模式空間的內容 a text 在行後面追加文字 支援使用 n實現多行追加 i text 在行前面插入文字 支援使用 n實現多行插入 c text 替換行為單行或多行文字 w path to somefile 儲存模式空間匹配到的行至指定檔案中 r path from somefil...