sed文本處理常見用法

sed文本處理常見用法 
 
2011-06-24  TsengYia#126.com http://tsengyia.blog.chinaunix.net/
 
################################################################# 
 
系統環境: 
    RHEL 6.0 [2.6.32-71.el6.i686] 

軟件環境: 
    sed-4.2.1-5.el6.i686 
 
################################################################# 
 
一、基本格式

sed -e '編輯指令' 文件1,文件2,文件3,……           #//過濾並輸出內容
sed -n -e '編輯指令' 文件1 文件2 文件3,……        #//只輸出需要處理的行
sed -i -e '編輯指令' 文件1 文件2 文件3,……        #//直接修改文件內容,而不是輸出過濾結果

    —— 只有一個編輯指令時,-e選項一般可以省略。
    編輯指令的格式:
        [地址1[,地址2]]操作函數[參數]

    —— 使用多個編輯指令時,可設置多個-e選項。
    sed -e '編輯指令1' -e '編輯指令2' 文件
    相當於
    sed -e '編輯指令1' 文件 ; sed -e '編輯指令2' 文件


二、應用舉例

1. 輸出符合條件的文本(p,正常輸出;l,以ASCII碼輸出非打印字符,其餘與p相同)

sed -n 'p' afile                          #//輸出所有行,等同於cat afile
sed -n '3p' afile                         #//輸出第3行
sed -n '3l' afile                         #//輸出第3行,其中非打印字符以ASCII碼錶示
sed -n '3,5p' afile                       #//輸出第3~5行
sed -n 'p;n' afile                        #//輸出所有的奇數行,n表示讀入下一行文本
sed -n 'n;p' afile                        #//輸出所有的偶數行,n表示讀入下一行文本
sed -n '1,5{p;n}' afile                   #//輸出第1~5行之間間的所有奇數行(第1、3、5行)
sed -n '10,${n;p}' afile                  #//輸出第10行至文件尾之間的所有偶數行

sed -n '/xml/p' afile                     #//輸出包含xml的行,正則表達式以“/”包圍
sed -n '4,/xml/p' afile                   #//輸出從第4行至第一個包含xml的行
sed -n '/xml/=' afile                     #//輸出包含xml的行所在的行號,=用來表示行號
sed -n '/^install/p' afile                #//輸出以install開頭的行
sed -n '/noarch$/p' afile                 #//輸出以noarch結尾的行
sed -n '$p' afile                         #//輸出最後一行
sed -n '/\<system\>/p' afile              #//輸出包含獨立單詞system的行,\< 與 \> 用來界定單詞
sed -n '/\bsystem\b/p' afile              #//輸出包含獨立單詞system的行,\b 用來界定單詞

2. 刪除符合條件的文本(d,刪除內容)

sed '3d' afile                            #//刪除第3行
sed '3,5d' afile                          #//刪除第3~5行
sed '/xml/d' afile                        #//刪除包含xml的行
sed '/xml/!d' afile                       #//刪除不包含xml的行,!符號表示操作取反
sed '/^install/d' afile                   #//刪除以install開頭的行
sed '/noarch$/d' afile                    #//刪除以noarch結尾的行、
sed '$d' afile                            #//刪除最後一行
sed '/^$/d' afile                         #//刪除所有的空行
sed '/^$/{n;/^$/d}' afile                 #//刪除重複的空行,連續多個空行只保留一個,效果同cat -s afile
                                          —— n表示讀下一行文本,/^$/d表示如果仍然是空行則刪除

3. 替換符合條件的文本(s,字符串替換;c,整行或多行替換;y,單個字符轉換)

sed 's/xml/XML/' afile                    #//將每行中的第一個xml替換爲XML,
                                          —— 替換操作中分隔符“/”也可改爲其他字符,如#等
sed 's/xml/XML/3' afile                   #//將每行中的第3個xml替換爲XML
sed 's/xml/XML/g' afile                   #//將文件中的所有xml都替換爲XML
sed 's/xml//g' afile                      #//將文件中的所有xml都刪除(替換爲空串)
sed 's/xml/&HTML/g' afile                 #//將文件中的所有xml都替換爲xmlHTML,&代表前面的查找串
sed 's/^/#/' afile                        #//將每行開頭插入一個#符號
sed 's/$/EOF/' afile                      #//將每行末尾添加EOF字符串
sed '/xml/s/^/#/' afile                   #//將包含xml的行的開頭插入一個#符號
sed 's/\(AB\).*\(CDE\).*\(FG\)/\2\1\3/' afile    #//將AB...CDE...FG替換爲CDE...AB...FG
                                          —— 其中的\1、\2、\3分別代表查找串中以括號\(、\)包圍的第1、2、3個字符串
sed '3,5s/xml/XML/g' afile              #//將第3~5行中的所有xml替換爲XML
sed '/xml/s/com/COM/g' afile             #//將包含xml的所有行中的com都替換爲COM

sed '2cNewString' afile                   #//將第2行替換爲Newtring
sed '2,5cLine1\nLine2' afile              #//將第2~5行替換爲兩行,即Line1和Line2,其中的\n表示換行
sed 'y/abcd/ABCD/' afile                  #//將文件中的a、b、c、d字符轉換爲大寫
sed '1,5y/abcd/ABCD/' afile               #//將第1~5行中的a、b、c、d字符轉換爲大寫
sed '/xml/y/com/COM/' afile               #//將包含xml的行中的c、o、m字符都轉換爲大寫


4. 遷移符合條件的文本(H,追加複製到剪貼板;g、G,將剪貼板中的文本覆蓋/追加到指定行;w,保存爲文件;r,讀取指定文件;a,追加指定內容)

sed '/xml/{H;d};$G' afile                 #//將包含xml的行遷移至文件末尾,;用來分隔多個操作
sed '/1,10{H;d};20G' afile                #//將第1~10行遷移至第20行後
sed '/xml/w out.file' afile               #//將包含xml的行另存爲文件out.file
sed '/xml/r host.conf' afile              #//將文件host.con的內容添加到包含xml的每一行之後

sed '3aNewLine' afile                     #//在第3行之後插入一個新行,內容爲NewLine
sed '3aNewLine1\nNewLine2' afile          #//在第3行之後插入兩個新行,內容分別爲NewLine1、NewLine2
sed '/xml/aNewLine' afile                 #//在包含xml的每一行之後插入一個新行,內容爲NewLine


三、使用sed腳本 
    將多個編輯指令存放到文件中(每行一條編輯指令),通過-f選項來調用。
    例如以下操作 —— :
sed '/1,10{H;d};20G' afile                #//將第1~10行遷移至第20行後

    可以改用sed腳本文件的方式 —— :
[root@localhost ~]# vi opt.list
1,10H
1,10d
20G
[root@localhost ~]# sed -f opt.list afile

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章