標題:sed命令的使用
作用:sed(stream editer)是以行為單位處理文本數據,可以對數據按行進行選取(顯示打印)、替換、刪除和新增等功能。
工作流程:sed是一個流編輯器,它可以對從標准輸入流中得到的數據進行處理,然後把處理以後得到的結果輸出到標准輸出,而標准輸出通常關聯到終端屏幕,因此處理後的結果也會顯示到屏幕上。當然,也可以把標准輸出重定向到文件,這樣處理後的結果就會保存在磁盤文件中。
一、用法
sed [-nefr] [動作]
參數:
-n:使用安靜模式,取消自動打印模式空間。在一般來自STDIN的數據一般都會被列出到屏幕上,但如果加上-n參數後,則只有經過sed處理的那一行才會被列出來
-e:直接在命令行模式上進行sed的動作編輯
-f:直接將sed動作寫到一個文件內,-f filename可以執行filename內的sed動作
-i:直接修改讀的文件內容,而不是由屏幕輸出
動作說明:
1. [n1[n2]] function
1.1 n1,n2一般代表選擇進行動作的行數,10,20代表動作在10,20行間執行。如果不指定n1,n2,則表示後面的[動作]命令作用於與所有的行
1.2 除了用數字選擇進行動作的行的范圍,也可以用正則表達式,選擇進行操作的行的范圍
例如:打印顯示所有以"#"開頭的行 sed -n '/^#/p' filename
1.3 在進行替換命令的時候,一般需要用正則表達式所有行進行模式匹配,只有匹配成功的行,才會執行相應的動作操作
2. function有下面這參數:
[1] a : 新增
[2] c : 替換,c後面可以接字符串,這些字符串可以替換n1,n2之間的行
[3] d: 刪除
[4] i: 插入,i之後可接字符串,這些字符串會在新的一行出現
[5] p: 打印,通常會和-n一起運行
[6] s: 替換
二、實例
例1:以行為單位的刪除操作:
命令:nl test.da | sed '2,5d'
輸出:
例2:在第2行後面添加 "Drink tea\n Drink beer"
命令: sed '2,a Drink tea \n Drink beer' test.da
輸出:
例3:將第2~5行的內容替換成為"No,2-5 Number"
命令:sed '2,5c No,2-5 Number' test.da
輸出:
例4:打印2~5行的內容
命令:nl index.html | sed -n '2,5p'
輸出:
例5:打印除2~5行外的其他行
命令:nl index.html |sed -n '2,5!p
輸出:
解釋:打印除了第2~5行外的內容,亦即打印第1行和第6行~最後一行,所以可以用命令:nl index.html | sed -n '1p;6,$p'
例6:從某一行開始,按照指定的間隔打印文件中的行,比如從第2行開始每隔3行顯示文件的內容
命令:nl index.html | sed -n '2~3p'
輸出:
解釋:單引號中的第一個數字表示起始行數,第二個數字表示間隔數
例7:使用sed的s命令可以對文件中的字符串進行替換
假設現在要對如下的htm文件中的email地址從[email protected]改成[email protected]以及對年份數字2012進行替換為2013
<html>
<title>My homepage</title>
<body>
<a href="mailto:[email protected]">Email me!</a>
<br>
<p>Page created by:<a href="mailto:[email protected]">[email protected]</a></p>
<p>copyright @ 2012 mysite!</p>
</body>
</html>
命令:sed -e 's/[email protected]/[email protected]/g' -e 's/\b2012\b/2013/g' index.html
輸出:
解釋:sed命令中的-e選項表示指定多個編輯命令,也可以使用";"來連接多個編輯命令。例如,上面的命令也可以表示為:sed 's/[email protected]/[email protected]/g;s/\b2012\b/2013/g' index.html
g:表示全局替換
i:表示忽略大小寫
\b字符串\b表示正則匹配單詞
例8:使用sed命令實現對指定范圍行內的進行行末或行首添加字符
假設要對某個文件的部分行首或行末添加一定字符或字符串
命令:sed '1,4s/^./#&/' index.html |nl
解釋:&符號正則表達是所匹配的內容