sed的基礎應用

sed是一個非交互式的文本編輯器;sed一行一行的處理文件
sed有模式空間(主要活動空間)和緩存空間(輔助空間)兩個空間:
模式空間(pattern space)將文件中的一行內容讀取到臨時緩衝區(模式空間),通過處理後進行輸出並清空空間內容;
保持空間(hold space):保持空間不會自動清空也不會主動打印,須要經過命令和模式空間進行交互,主要用於sed的高級命令處理,是sed的輔助空間。
 
 
1、正則表達式
不少工具語言都支持使用正則表達式,可是sed中有些正則不能用,sed不支持\d類、\D、\W反義類,零寬斷言、懶惰(非貪婪)模式
 
sed中使用正則表達的注意點
1.sed默認爲貪婪模式,不支持懶惰模式
2.sed中使用正則表達式注意sehll特殊字符衝突問題,好比\(exp\),可是可使用-r參數解決衝突
3.sed中不支持使用\d和反義的\W等表達方式
 
下面是正則表達式的一些基礎內容
【元字符】
.     匹配換行符以外的任意字符
\w     匹配字母、數字、下劃線或漢字
\s     匹配任意的空白符
\d     匹配數字
\b     匹配單詞的開始和結束
^     匹配字符串的開始
$     匹配字符串的結束
\     轉義字符(好比想要匹配.的時候須要進行轉義)
【限定符】
*     重複0或更屢次
+     重複1次或更屢次
?     重複0次或1次
{m}     重複m次
{m,}     重複m次或更屢次
{m,n}     重複m到n次
{,n}     重複0次到n次
[1-9]     指定範圍內的字符,1-9範圍內的,或者a-z,A-Z,或者用逗號隔開的字符
【反義符】(大寫的與元字符內容相反)
\W     匹配任意不是字母、數字、下劃線、漢字的字符
\S     匹配任意不是空白符的字符
\D     匹配任意不是數字的字符
\B     匹配任意不是單詞開頭和結束的位置
[^xyz]     匹配除了xyz這幾個字母之外的任意字符
【捕獲】
(exp)    匹配exp,經過小括號捕獲文本到自動命名的組裏。
(?<name>ex)     匹配ex,並捕獲文本到名稱爲name的組裏
(?:exp)     匹配exp,不捕獲匹配的文本,也不分配組號
【零寬斷言】
(?=exp)     匹配exp前面的位置
(?<=exp)     匹配exp後面的位置
(?!exp)     匹配後面跟的不是exp的位置
(?<!exp)     匹配前面跟的不是exp的位置
【貪婪與懶惰】
*?     重複任意次,但儘量少的重複
+?     重複1次或更屢次,但儘量少的重複
??     重複0次或1次,但儘量少的重複
{n,m}?     重複n到m次,但儘量少的重複
{n,}?     重複n次以上,但儘量少的重複
 
2、sed基礎命令
1.sed的命令格式
sed [-options] [commands] filename
sed [-options] --f scriptfile filename
 
command格式:
[address-range] [pattern-to-match] [sed-command]
例如:sed -n '5,8p' passwd(打印passwd文件中第5到第8行的數據)
 
下面是一個命令格式的圖:
 
說明:
1.sed命令的尋址和正則表達式不是必填項
2.行號尋址:(line1,line2)使用m,n表示經過行號尋址,讀取文件m到n行(例如5,8);若是隻有一個數字m表示讀取第m行
3.正則表達式尋址:(/pattern/ ),使用/pattern/來匹配行,正則須要放到//中。若是用到了()[]等須要用\進行轉義;也可使用sed的-r參數,這樣就不須要轉義了
4.使用行號和正則來尋址:(line1,/pattern/),來尋找line1行到匹配到/pattern/的行,若是找不到/pattern/則從line1開始一直讀取到結束
 
【sed的-options】
-n     抑制輸出,只打印匹配到的行。若是不加-n會打印出一行行讀入緩衝區後默認打印的全部行。
     例以下面的打印passwd文件以bash結尾的內容:
     不加-n:
     
     加-n:
     
-i     修改原文件。好比刪除d,追加a,修改等
-r     正則匹配時,不須要對()進行轉義了
-e     多重編輯。sed -e '1,3d' -e 's/abc/def/g' filename
     
【sed的command的命令】
p     打印
d     刪除(若是須要直接操做原文件,須要用到sed -i 操做)
s     1.提取內容,s/正則表達式/\1\2/p。s/(.*)/\1/p(\1表示捕獲第一個小括號內的內容。\n來表示第n個捕獲的內容)
       2.替換內容,s/要替換的內容/替換的內容/g。若是用g表示全局替換,不加g只替換找到的第一個字符串
i     在匹配的行前加入一行。sed -i '5i\要插入的內容\' filename
a     在匹配的行後追加一行。sed  -i '5a\要追加的內容\' filename
   若是是要在匹配到的正則後追加一行: sed -ie '/正則內容/a\"要追加的內容"' filename
       若是要追加的內容共使用了變量,須要用\對$進行轉義,正則中的不須要加\:sed -ie "/$a/a\\$b" filename
   
c     修改匹配到的行。sed -i '5c\要修改的內容' filename
y     轉換符。y/要轉換的字符/轉換後的字符/。注意:要轉換的字符和轉換後的字符個數是相等的,且是一一對應的關係。若是有多個字符要轉換,他會按照命令中的位置將對應的字符所有轉換成轉換後的樣子
q     退出。再也不進行sed處理
w     寫到新文件。sed '/要匹配的行/w newfile' filename
 
2.sed命令的實戰
【查找】
例子:查找passwd文件中以bash結尾的行並打印出來
sed -n '/bash$/p' passwd
【刪除】
例子:刪除passwd中以test開頭的行
sed -i '/^test/d' passwd
【打印】
例子:打印passwd文件中第3到第8行的內容
sed -n '3,8p' passwd
【提取】
例子:提取passwd中有登陸shell(結尾爲bash)的用戶名及其家目錄
下面兩種寫法結果都同樣。s命令前能夠先用正則匹配行
sed -rn 's/(.*)[x:0-9]*([\/a-z]*):\/bin\/bash$/\1 \2/p' passwd
sed -nr '/bash$/s/(\w+):\w:[0-9]+:[0-9]+:.*:(.*):.*/\1 \2/p' passwd
【替換】
例子:將passwd文件中的nologin所有替換爲meitian
sed -i 's/nologin/meitian/g' passwd
注意:若是不加g則只會替換第一個字符串,加g是全局的進行替換
【插入】
例子:在passwd第5行上插入一行hello world
sed -i '5i\hello world' passwd
例子:在psswd第5行下面追加一行hello world
sed -i '5a\hello world' passwd
【修改】
例子:將第5行的內容修改成hello world
sed -i '5c\hello world' passwd
【轉換】
例子:將abcdef轉換成對應的數字123456
echo "aaddddxxxxaacfedbsdf"| sed 'y/abcdef/123456/'
【退出】
例子:passwd文件,處理到第5行退出
sed '5q' passwd
 
3、實戰中的一些注意點
1.在sed命令中使用變量($a類型),sed後面的命令必須使用雙引號括起來,不然$會被當成普通字符
    例子:將passwd文件中的root變動爲變量name中的值
    sed -i "s/root/$name/g" passwd
     
2.修改內容時,可使用正則的()捕獲內容,而後經過\1等簡化要修改的腳本
    例子:去掉hosts文件前全部行前面的#號
    sed -i 's/^#(.*)/\1/g' hosts
3.將sed提取到的值賦值到變量
     例子:將本機的IP地址賦值到變量ip。
     方法一:使用變量名=$(打印變量值)
     ip=$(ifconfig eth0 | sed -nr 's/\s+inet addr:([0-9]+.[0-9]+.[0-9]+.[0-9]+) .*/\1/p'
  
     方法二:使用eval $(打印變量名=變量值)
     eval $(ifconfig eth0 | sed -nr '/inet/s/\s+inet addr:([0-9]+.[0-9]+.[0-9]+.[0-9]+) .*/ip=\1/p' )
4.sed命令在使用時會在當前處理的文件目錄下生成一個緩存文件,可是有的文件目錄只有root有權限。若是咱們沒有root權限,也不知道sudo的密碼。能夠將文件先cp到一個有權限的目錄下進行操做,而後文件處理後再cp回來。
 
 
sed還有不少高級命令,好比G等,能夠再多瞭解一下,以便達到更高效的使用。
用了awk和sed後,我我的以爲若是隻是對數據進行提取,用awk更靈活更方便。而對一個文件進行編輯修改,仍是用sed更方便一些。各有各的好處。另外在使用awk處理文件時會感受處理過程有點慢。
相關文章
相關標籤/搜索