1. 簡介
sed是一個(gè)很好的文件處理工具,本身是一個(gè)管道命令。sed處理文件的方式為:逐行處理。具體為:首先sed把當(dāng)前正在處理的行保存臨時(shí)緩存區(qū)中,然后處理臨時(shí)緩沖區(qū)中的行,可以是替換、刪除、新增、選取等,完成后把該行輸出到屏幕上。sed每處理完一行就將其從臨時(shí)緩沖區(qū)刪除,然后將下一行讀入,進(jìn)行處理和顯示。處理完輸入文件的最后一行后,sed便結(jié)束運(yùn)行。
2. sed命令行格式
sed [選項(xiàng)] [命令]
2.1 選項(xiàng)
-n,使用安靜(silent)模式。在一般 sed 的用法中,所有來自 STDIN 的數(shù)據(jù)一般都會(huì)被列出到終端上。但如果加上 -n 參數(shù)后,則只有經(jīng)過sed特殊處理的那一行(或者動(dòng)作)才會(huì)被列出來。
-e,直接在命令列模式上進(jìn)行sed的動(dòng)作編輯。
-f,直接將sed的動(dòng)作寫在一個(gè)文件內(nèi)。-f filename 則可以運(yùn)行filename內(nèi)的sed命令。
-r,sed 的動(dòng)作支持的是延伸型正規(guī)表示法的語法。(默認(rèn)是基礎(chǔ)正規(guī)表示法語法)
-i,直接修改讀取的文件內(nèi)容,而不是輸出到終端。
2.2 指定行數(shù)
[n1[,n2]]function
例子:
sed -n '2p' datafile #打印第2行sed '2,5d' datafile #刪除第2到第5行
2.3 常用命令
命令
功能
a\
在當(dāng)前行后添加一行或多行。多行時(shí)除最后一行外,每行末尾需用“\”續(xù)行
c\
用此符號(hào)后的新文本替換當(dāng)前行中的文本。多行時(shí)除最后一行外,每行末尾需用"\"續(xù)行
i\
在當(dāng)前行之前插入文本。多行時(shí)除最后一行外,每行末尾需用"\"續(xù)行
d
刪除行
h
把模式空間里的內(nèi)容復(fù)制到暫存緩沖區(qū)
H
把模式空間里的內(nèi)容追加到暫存緩沖區(qū)
g
把暫存緩沖區(qū)里的內(nèi)容復(fù)制到模式空間,覆蓋原有的內(nèi)容
G
把暫存緩沖區(qū)的內(nèi)容追加到模式空間里,追加在原有內(nèi)容的后面
l
列出非打印字符
p
打印行
n
讀入下一輸入行,并從下一條命令而不是第一條命令開始對(duì)其的處理
q
結(jié)束或退出sed
r
從文件中讀取輸入行
!
對(duì)所選行以外的所有行應(yīng)用命令
s
用一個(gè)字符串替換另一個(gè)
g
在行內(nèi)進(jìn)行全局替換
w
將所選的行寫入文件
x
交換暫存緩沖區(qū)與模式空間的內(nèi)容
y
將字符替換為另一字符(不能對(duì)正則表達(dá)式使用y命令)
2.4 例子
2.4.1 打印 p
sed -n '1p' test.txt # 只顯示文件的第1行 sed -n '$p' test.txt # 只顯示文件的最后一行sed -n '1, 2p' test.txt # 只顯示文件的第1行到第2行sed -n '2, $p' test.txt # 顯示文件的第2行到最后一行sed -n '/China/p' test.txt # 顯示帶有 China的行
2.4.2 刪除 d
sed '1d' test.txt # 輸出刪除第1行sed '$d' test.txt # 輸出刪除最后一行sed '1, 2d' test.txt # 輸出刪除第1行到第2行sed '2, $d' test.txt # 輸出刪除第2行到最后一行sed -n '/USA/d' test.txt # 刪除帶有 USA 的行
2.4.3 增加一行或多行字符串
sed '1a China' test.txt #在第一行后加一行:chinased '2,5a China' test.txt #在第2行到第5行后各加一行:chinased '1a China\nUSA' test.txt # 在第一行后加兩行:分別為china和USA。\n代表換行sed '/Asia/a China' test.txt #在含有Asia的行后加一行:china#將a換成i,代表在本行之前添加一行
2.4.4 替換行
sed '1c China' test.txt #把第一行替換為chinased '2,5c China' test.txt #在第2行到第5行各替換為:chinased '/USA/c China' test.txt #把第含有USA的行替換為china
2.4.5 替換一行中的部分字符串
sed 's/USA/China/g' test.txt #把USA替換為chinased '2s/USA/China/g' test.txt #把第二行中的USA替換為chinased '/Asia/s/USA/China/g' test.txt #把第包含Asia的行中的USA替換為China
進(jìn)階:(1)在指定行的末尾加字符串
sed '2{s/$/Asia/g}' test.txt #在第2行的末尾加上Asiased '/Cina/{s/$/Asia/g}' test.txt #在含有China的行的末尾加上Asia
(2)刪除指定行后的換行符\n
sed '2{N;s/\n//g}' test.txt #刪除第二行后的換行符sed '/USA/{N;s/\n//g}' test.txt #刪除含有USA的行后的換行符sed ':t;N;s/\n//;b t' test.txt #刪除文件中所有的換行符 也可以用tr: cattest.txt|tr '\n' ' '
(3)刪除指定行前的換行符\n
sed -r ':1;N;/\nUSA/s/\n//g;t1;P;D' test.txt #將 USA前的換行符刪掉
3.sed中的正則
元字符
功能
示例
^
行首定位符
/^my/ 匹配所有以my開頭的行
$
行尾定位符
/my$/ 匹配所有以my結(jié)尾的行
.
匹配除換行符以外的單個(gè)字符
/m..y/ 匹配包含字母m,后跟兩個(gè)任意字符,再跟字母y的行
*
匹配零個(gè)或多個(gè)前導(dǎo)字符
/my*/ 匹配包含字母m,后跟零個(gè)或多個(gè)y字母的行
[]
匹配指定字符組內(nèi)的任一字符
/[Mm]y/ 匹配包含My或my的行
[^]
匹配不在指定字符組內(nèi)的任一字符
/[^Mm]y/ 匹配包含y,但y之前的那個(gè)字符不是M或m的行
\(..\)
保存已匹配的字符
1,20s/\(you\)self/\1r/ 標(biāo)記元字符之間的模式,并將其保存為標(biāo)簽1,之后可以使用\1來引用它。最多可以定義9個(gè)標(biāo)簽,從左邊開始編號(hào),最左邊的是第一個(gè)。此例中,對(duì)第1到第20行進(jìn)行處理,you被保存為標(biāo)簽1,如果發(fā)現(xiàn)youself,則替換為your。
&
保存查找串以便在替換串中引用
s/my/**&**/ 符號(hào)&代表查找串。my將被替換為**my**
\<
詞首定位符
/\<my/ 匹配包含以my開頭的單詞的行
\>
詞尾定位符
/my\>/ 匹配包含以my結(jié)尾的單詞的行
x\{m\}
連續(xù)m個(gè)x
/9\{5\}/ 匹配包含連續(xù)5個(gè)9的行
x\{m,\}
至少m個(gè)x
/9\{5,\}/ 匹配包含至少連續(xù)5個(gè)9的行
x\{m,n\}
至少m個(gè),但不超過n個(gè)x
/9\{5,7\}/ 匹配包含連續(xù)5到7個(gè)9的行