Unix文本處理工具之sed
和上文提到的awk一樣,sed也是Unix的文本處理工具。sed是Stream Editor(流式編輯器)的縮寫,它能夠基於模式匹配過濾(所謂過濾就是在文件中找到符合某些條件的行)修改文本(就是對找到的符合條件的內容進行一些修改操作)。
1、sed命令格式
1.1 sed命令的基本格式
sed命令主要有三種使用形式:
sed ‘編輯指令’ 文件1 文件2 ……:用於將處理後的結果輸出
sed -n ‘編輯指令’ 文件1 文件2 ……:用於只輸出編輯指令影響的行
sed -i ‘編輯指令’ 文件1 文件2 ……:用於直接在文本文件上修改文本內容(在物理磁盤上修改文件)
1.2 編輯指令
編輯指令主要由兩部分組成:前面是逗號隔開的兩個地址(或者沒有逗號,只有一個地址),代表要處理文本的起始位置到結束位置;後面是要進行的操作類型。格式如下:
[起始地址[,結束地址]]操作類型
如果在一條sed命令中要用到多條編輯指令,那麼各個編輯指令之間要用;隔開,也可以將多條編輯指令放在多個單引號中,但是這樣的話,要在每個單引號的前面加一個-e。下面是一個簡單的例子:
[plain]
$cat sed_test.txt
1 apple a,b,d,f
2 boy alsdjf,apple,kdjf
3 cat 163.2.201.1
4 dog www.google.com
5 eat http://blog.csdn.net/xia7139
$sed -n '2,5p' sed_test.txt
2 boy alsdjf,apple,kdjf
3 cat 163.2.201.1
4 dog www.google.com
5 eat http://blog.csdn.net/xia7139
$sed -n '5p' sed_test.txt
5 eat http://blog.csdn.net/xia7139
$sed -n -e '2p' -e'5p' sed_test.txt
2 boy alsdjf,apple,kdjf
5 eat http://blog.csdn.net/xia7139
1.3 操作類型
sed常用的操作類型如下:
操作 作用
p 打印文本行(print)
n 取下一行(next)
d 刪除(delete)
s 字符串替換(substitude)
a 追加新的文本(append) 2、例子
下面的例子都是對文提到的文件sed_test.txt的操作:
[plain]
使用正則表達式:
(1)輸出從第一個包含kdjf的行到最後一行($代表最後一行)
$sed -n '/kdjf/,$p' sed_test.txt
2 boy alsdjf,appleapple,kdjf
3 cat 163.2.201.1
4 dog www.google.com
5 eat http://blog.csdn.net/xia7139
(2)輸出包含單詞apple的行
(shell中單詞是指一個字符串前後有空格或其它標點符號。正則表達式中用一個<>來界定一個單詞,在sed中用該符號要進行轉義。)
$sed -n '/\<apple\>/p' sed_test.txt
1 apple a,b,d,f
刪除指定行(這裡沒有-i,不對原文件進行操作,只是將處理後的結果輸出。):
(1)刪除第2到4行
$sed '2,4d' sed_test.txt
1 apple a,b,d,f
5 eat http://blog.csdn.net/xia7139
(2)刪除包含appleapple的行和最後一行($)
$sed '/appleapple/d;$d' sed_test.txt
1 apple a,b,d,f
3 cat 163.2.201.1
4 dog www.google.com
(3)刪除不包含(!表示反選,選中不符合條件的行)apple的行(這樣就只剩下了包含apple的行了)
$sed '/apple/!d' sed_test.txt
1 apple a,b,d,f
2 boy alsdjf,appleapple,kdjf
替換指定文本:
(1)將1-4行的apple換成AMAZON。s代表替換,g代表如果一行出現兩個apple則全部替換。
$sed '1,4s/apple/AMAZON/g' sed_test.txt
1 AMAZON a,b,d,f
2 boy alsdjf,AMAZONAMAZON,kdjf
3 cat 163.2.201.1
4 dog www.google.com
5 eat http://blog.csdn.net/xia7139
(2)注釋shell腳本(在行首插入#)
$sed '1,3s/^/#/g' sed_test.txt
#1 apple a,b,d,f
#2 boy alsdjf,appleapple,kdjf
#3 cat 163.2.201.1
4 dog www.google.com
5 eat http://blog.csdn.net/xia7139
(3)刪除字符串apple(如果不寫起始地址和結束地址,則默認為所有行。)
$sed 's/apple//g' sed_test.txt
1 a,b,d,f
2 boy alsdjf,,kdjf
3 cat 163.2.201.1
4 dog www.google.com
5 eat http://blog.csdn.net/xia7139
以上兩篇文章介紹了Unix兩個文本處理工具awk和sed,希望對大家有所幫助。
3、初步體會sed的威力
比如你有一個文件內容如下:
[python]
test.txt:
{'books/daglib/0015113': '<title>Scale-isometric polytopal graphs in hypercubes and Z<sub>n</sub>.</title>\n',
'books/daglib/0097705': '<title>Discrete total l<sub>p</sub>-norm approximation problem for the function.</title>\n',
'books/daglib/p/AveneauCFM11': '<title>A Framework for <i>n</i>-Dimensional Visibility Computations.</title>\n',
'books/daglib/p/Carter11': '<title>Using <i>Dungeons and Dragons</i> to Integrate Curricula in Classroom.</title>\n',
'books/daglib/p/CasolaLRV11': '<title>Access Control in Cloud-on-Grid Systems: The <i>PerfCloud</i> Case Study.</title>\n',
'books/daglib/p/ChunKZDMZ11': '<title>Reverse Engineer of Gene Networks with Application <i>in silico</i> Network.</title>\n',
'books/daglib/p/ChungK11': '<title>eQTL Mapping for Functional Classes of <i>Saccharomyces cerevisiae</i> Genes wssion.</title>\n',
'books/daglib/p/Goldman11': '<title>A Model for Computer Graphics Based on Algebra for \xe2\x84\x9d<sup>3</sup>.</title>\n',
'books/daglib/p/LiZ11': '<title>Line Geometry over \xe2\x84\x9d<sup>3, 3</sup>, and Stewart Platforms.</title>\n',
'books/daglib/p/Liestol11': '<title><i>Situated Simulations</i> Between Reality and Designing a Narrative Space.</title>\n'}
現在你要將其中的各行中的類似於標簽之類的東西去掉,只需用一條sed命令:
[plain]
$sed -e 's/<title>//g;s/<\/title>//g' -e 's/<i>//g;s/<\/i>//g' -e 's/<sub>//g;s/<\/sub>//g' -e 's/<sup>//g;s/<\/sup>//g' test.txt
{'books/daglib/0015113': 'Scale-isometric polytopal graphs in hypercubes and Zn.\n',
'books/daglib/0097705': 'Discrete total lp-norm approximation problem for the function.\n',
'books/daglib/p/AveneauCFM11': 'A Framework for n-Dimensional Visibility Computations.\n',
'books/daglib/p/Carter11': 'Using Dungeons and Dragons to Integrate Curricula in Classroom.\n',
'books/daglib/p/CasolaLRV11': 'Access Control in Cloud-on-Grid Systems: The PerfCloud Case Study.\n',
'books/daglib/p/ChunKZDMZ11': 'Reverse Engineer of Gene Networks with Application in silico Network.\n',
'books/daglib/p/ChungK11': 'eQTL Mapping for Functional Classes of Saccharomyces cerevisiae Genes wssion.\n',
'books/daglib/p/Goldman11': 'A Model for Computer Graphics Based on Algebra for \xe2\x84\x9d3.\n',
'books/daglib/p/LiZ11': 'Line Geometry over \xe2\x84\x9d3, 3, and Stewart Platforms.\n',
'books/daglib/p/Liestol11': 'Situated Simulations Between Reality and Designing a Narrative Space.\n'}
如果要在原文件中修改,只需加-i參數。