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
sed文本處理常見用法
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.