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