1. 程式人生 > 其它 >sed:輸入流編輯器

sed:輸入流編輯器

對輸入資料流進行編輯

1、命令格式

sed [OPTION]... {script-only-if-no-other-script} [input-file]...

選項 內容
-n 只打印模式匹配的行
-e script 將指令碼新增到要執行的命令中。直接在命令列模式上進行sed的動作編輯。
-f script-file 將指令碼檔案的內容新增到要執行的命令中。直接將sed的動作寫在一個檔案內,-f filename則可以執行filename內的sed動作。
--follow-symlinks 當處理到位時,遵循符號連結;硬連結仍然會中斷。
-i[SUFFIX] 直接修改檔案內容
-c 在-i模式下移動檔案時使用copy而不是rename。
-l N 為“l”命令指定所需的行換行長度
--posix 禁用所有GNU擴充套件。
-r 在指令碼中使用擴充套件正則表示式。(預設是基礎正則表示式)
-s 將檔案視為單獨的而不是單個連續的長流。
-u 從輸入檔案中載入最小數量的資料,並更頻繁地重新整理輸出緩衝區
--help 顯示此幫助並退出
--version 輸出版本資訊並退出
常用命令
= 列印當前行號。
a \ 新增,a的後面可以接字串,而這些字串會在新的一行出現(目前的下一行)
i \ 插入,i的後面可以接字串,而這些字串會在新的一行出現(目前的上一行)
q 立即退出sed指令碼,不再處理任何輸入,除非自動列印未禁用,否則將列印當前模式空間。
Q 立即退出sed指令碼,不再處理任何輸入。
r filename 附加從檔名讀取的文字。
R filename 附加從檔名中讀取的行。該命令的每次呼叫都從檔案中讀取一行。
{ 開始一個命令塊(以一個}結束)。
b label 分支到指令碼中帶有標記的地方,如果分支不存在則分支到指令碼的末尾;
t label 如果s///在最後一行輸入被讀取之後,並且在最後一個t或t命令之後,已經成功地進行了替換,那麼轉移到label;如果標籤被省略,分支到指令碼的結尾。
T label 如果從最後一行輸入和最後一個T或t命令開始,沒有s///進行成功的替換,則轉移到label;如果標籤被省略,分支到指令碼的結尾。
c \ 將選定的行替換為文字,其中每個文字都嵌入了換行符,換行符前面有一個反斜槓。
d 刪除,刪除選擇的行;
D 刪除模式空間中第一個內嵌的換行。
h/H 複製/追加模式空間以容納空間。
g/G 複製/附加保持空間到模式空間。
x 交換hold和模式空間的內容。
l 以“清晰可見”的形式列出當前行。
l width 以“視覺上無歧義”的形式列出當前行,並在寬度字元處斷開。
n/N 將下一行輸入讀入/追加到模式空間。
p 列印當前模式空間。列印,也就是將某個選擇的資料打印出來,通常會和sed -n一起執行。
P 列印到當前模式空間的第一個內嵌換行。
s/正則表示式/更換/ 替換,可以直接進行替換工作。通常這個s的動作可以搭配正則表示式!例如1,20s/old/new/g
w filename 寫並追加模板塊到file末尾;
W filename 寫並追加模板塊的第一行到file末尾;
y/source/dest/ 將原始檔中出現的模式空間中的字元轉換為dest中相應的字元。

任何可顯示的字元都可以扮演定界符的角色(比如分號、冒號、逗號或/),從而分隔正則表示式與替代文字。

sed也可以使用向後利用。如echo /home/test/ | sed 's;(/home)/test/;\1/t2/;'

&在替代文本里表示的意思是:從此點開始替代成匹配於正則表示式的整個文字。如果要在替代文本里使用&的字面意思,就需要用反斜槓進行轉義

在s命令裡以g結尾表示的是:全域性性,即以”替代文字取代正則表示式中每一個匹配的“

echo Tolstoy reads well. Tolstoy writes well. >a.txt 
sed 's/Tolstoy/Camus/g' a.txt

後面以數字結尾,表示第N個匹配出現才要被取代

sed 's/Tolstoy/Camus/2' a.txt

給予sed多個命令是比較容易的。在命令列上,這是通過-e選項的方式來完成。每一個編輯命令都使用一個-e選項:

sed -e 's/Tolstoy/Camus/g' -e 's/reads/bbb/' a.txt

將編輯命令全部放在一個腳本里,在使用sed -f搭配

# cat b.txt 
s/old/new/g
s/ccc/ddd/
s/1111/222/

# sed -f b.txt a.txt 

sed的工作方式:命令列上的每個檔名會一次開啟於讀取。如果沒有檔案則使用標準輸入,檔名"-"(單個破折號)可用於表示標準輸入。sed讀取每個檔案,一次讀一行,當多有操作(命令)完成後,sed會將模式空間的最後內容列印到標準輸出,再回到開始處,讀取另一個輸入行。

sed列印:-n 於p搭配

sed -n 'aaa'p   a.txt

2、Sed的其他應用

2.1、匹配特定行:限制一條命令要應用到那些行,只要再命令前置一個地址即可。
命令形式:sed address commang

2.1.1、正則表示式:
①將一模式放置到一條命令之前,可限制命令應用於匹配模式的行。可與s命令搭配使用:

/oldfunc/   s/$/#xxx:migrate to newfunc/  註釋部分原始碼

②s命令裡的空模式指的是"使用前一個正則表示式"

/Tolstoy/ s//& and Camus/g

2.1.2、最終行:符號$指"最後一行",指的是輸入資料的最後一行。

sed -n '$p' "$1"           引號裡為指定顯示的資料

2.1.3、範圍:可指定行的範圍,僅需將地址以逗號隔開:

sed -n '10,40p'  foo.xml     僅列印10~40行
sed '/foo/,/bar/  s/a/b/g'    僅替換範圍內的行;從含有foo的行開始,再匹配是否有bar開始的行,將匹配後的結果中a全部替換成b

2.1.4、否定正則表示式:將命令應用於不匹配與特定模式的每一行,通過將!加再正則表示式後面就可以。

sed '/used/!'s/new/used/g b         將沒有used的每個行裡所有的new改為used。!後不能跟空白

2.1.5、行標號:可以使用絕對的行編號作為地址。

2.2、

完全一致的匹配:自最左邊開始匹配、針對每一個子模式、由左至右,必須匹配到最長的可能字串。
echo Tolstoy is worldly | sed 's/T.*y/Camus/'

在文字查詢時有可能會匹配到Null字串。而在執行文字時,也允許你插入文字:
echo abc | sed -e s/1*/1/g