sed(流編輯器)是最早支持正則表達(dá)式的工具之一,至今仍然用于文本處理,特別是用于替換命令https://zh.wikipedia.org/wiki/Sed。一般用來(lái)對(duì)文本進(jìn)行增刪改查。
Sed用的比較多的不是流編輯器,而是文本處理的功能:增、刪、改、查四個(gè)功能。
sed功能強(qiáng)大,有自己的語(yǔ)法,相當(dāng)于一門編程。
sed常見參數(shù)
-n :禁止顯示所有輸入內(nèi)容,只顯示經(jīng)過(guò)sed處理的行(常用)
-e :直接在命令模式上進(jìn)行 sed 的動(dòng)作編輯,接要執(zhí)行的一個(gè)或 者多個(gè)命令(和grep命令里的-e參數(shù)一樣)
-f :執(zhí)行含有 sed 動(dòng)作的文件(當(dāng)代碼部分很長(zhǎng)時(shí),把那些代碼指定到一個(gè)文件,用-f指定這個(gè)文件,用得少)
-r :sed 的動(dòng)作支持的擴(kuò)展正則(默認(rèn)基礎(chǔ)正則)
-i :直接修改讀取的文件內(nèi)容,不輸出(grep命令里的-i是忽略大小寫)。
sed常見用法
sed [-options] script file(s)
[-options]:在options前面加-表示可以省略,'script'有自己的一套語(yǔ)法
script代碼部分的構(gòu)成: [address][!] command
address為定位地址,處理哪幾行;
!表示否定,如果address是第1行,1!是不處理第一行以外的其它行;
command:命令或是代碼。
- 常見 'script' address
2: 第 2 行
2,4: 第2行到第4行
2,$: 第 2 行到最后一行,$ 表示最后
2~3: 從第 2 行開始,每隔 3 行取一行2、5、8
2,+4: 從第 2 行到 2+4 行
/pattern/:匹配上 pattern 的行(pattern 為關(guān)鍵詞)
[!]: 表示否定,取反:'2 !' 表示除了第二行
- 常見 'script' command :增刪改查
a:append,在指定行的后增加一行,內(nèi)容為 a 的后面接的字串
i:insert,在指定行的前增加一行,內(nèi)容為 i 的后面接的字串
d:delete,刪除某一行或者某幾行,也可以指定刪除匹配上的行
c:change,改變指定行的內(nèi)容
s: 更改或替換字符串,使用格式為 's/pattern/new/[flags]', 把pattern替換成new,默認(rèn)只替換一個(gè),可以指定flags (沒有指定flag就默認(rèn)替換第一處,如果flag為g,全局替換。)
y: 轉(zhuǎn)換,實(shí)現(xiàn)字符一對(duì)一轉(zhuǎn)換,格式 ‘y/abc/ABC/'
p:print,把匹配或修改過(guò)的行打印出來(lái),通常與–n參數(shù)合用(查的功能,類似于grep搜索的功能)
sed文本處理常用的四個(gè)功能使用示例及詳解
1.sed命令給文本增加內(nèi)容
a:在指定行的后增加一行
########a∶append,在指定行的后增加一行,內(nèi)容為 a 的后面接的字串
cat readme.txt
##查看原文件,對(duì)比后面操作
cat readme.txt | sed '1a There are something I want you to know'
##在第1行的最后加There are something I want you to know

i:在指定行的前增加一行
########i∶insert,在指定行的前增加一行,內(nèi)容為 i 的后面接的字串
cat readme.txt
##查看原文件,對(duì)比后面操作
cat readme.txt | sed '1,2i Let us start our journey'
##在1到2行前面分別增加 Let us start our journey

結(jié)合-e參數(shù)使用:可以執(zhí)行多個(gè)命令
########-e :直接在命令模式上進(jìn)行 sed 的動(dòng)作編輯,接要執(zhí)行的一個(gè)或 者多個(gè)命令
cat readme.txt
cat readme.txt | sed -e '2i I have something to let you know' -e '2a We will be with you during a long journey'
##2i,在第二行的前面加I have something to let you know;2a第二行的后面加We will be with you during a long journey

2.sed命令刪除文本內(nèi)容
d:刪除某一行或者某幾行
########d∶delete,刪除某一行或者某幾行,也可以指定刪除匹配上的行
cat readme.txt
##查看原文件,對(duì)比后面操作
cat readme.txt | sed '1,3d'
##刪除第1到第3行

刪除空白行
########刪除空白行
cat readme.txt
##查看原文件,對(duì)比后面操作
cat readme.txt | sed '/^$/d'
###用關(guān)鍵詞去匹配地址,^代表行首,$代表行尾,行首和行尾接在一起就是一行空白行。注意事項(xiàng),有時(shí)候一行只有一個(gè)空格符,雖然看起來(lái)是空白行,但是有一個(gè)空格在,就不是空白行,也就不會(huì)被識(shí)別。

3.sed命令修改文本內(nèi)容
c:改變指定行的內(nèi)容
########c∶change,改變指定行的內(nèi)容(改的是整行的內(nèi)容)
cat readme.txt
##查看原文件,對(duì)比后面操作
cat readme.txt | sed '2,4c *********'
##把2到4行的內(nèi)容刪除,2到4只用*********替代
##如何把2到4行,每行都變?yōu)?********,用-e同時(shí)操作
cat readme.txt | sed -e '2,4i *********' -e '2,4d'

s:更改或替換字符串
########s∶更改或替換字符串,使用格式為 's/pattern/new/[flags]', 把pattern替換成new,(如果沒有flags)默認(rèn)只替換一個(gè),可以指定flags ,([flags]指定第幾處,如果替換第一處,就放1,如果flags里是g,代表全局替換)
#(區(qū)別s和y,s里的pattern是整個(gè)字符串替換,y是字符轉(zhuǎn)換)
cat readme.txt
##查看原文件,對(duì)比后面操作
cat readme.txt | sed 's/is/IS/'
###flag沒有指定的數(shù)字,默認(rèn)為只改每一行的第一處
cat readme.txt | sed 's/is/IS/2'
###flag指定為2處理每一行的第二處
cat readme.txt | sed 's/is/IS/g'
##flag指定為g,全部替換

以上的這張截圖自己做的注釋不清晰,補(bǔ)充和示例如下:
說(shuō)明:'s/is/IS/'處理每一行的第一處,'s/is/IS/2'處理每一行的第二處,'s/is/IS/g'處理全部
's/pattern/new/[flags]'
###自己創(chuàng)建一個(gè)tmp.txt,用來(lái)操作,加強(qiáng)理解
cat tmp.txt
##查看原文件,對(duì)比后面操作
cat tmp.txt | sed 's/is/IS/'
###flag沒有指定的數(shù)字,默認(rèn)為只改每一行的第一處
cat tmp.txt | sed 's/is/IS/2'
###flag指定為2處理每一行的第二處
tmp.txt | sed 's/is/IS/g'
##flag指定為g,全部替換

y:轉(zhuǎn)換,實(shí)現(xiàn)字符一對(duì)一轉(zhuǎn)換(修改)
##y∶轉(zhuǎn)換,實(shí)現(xiàn)字符一對(duì)一轉(zhuǎn)換(修改),格式 ‘y/abc/ABC/'
cat readme.txt
##查看原文件,對(duì)比后面操作
cat readme.txt | sed 'y/abcde/ABCDE/'
###一個(gè)個(gè)字符對(duì)應(yīng)修改,所有的都替換,不像s需要指定flags

指定路徑替換
###指定路徑或是地址來(lái)替換
cat readme.txt
##查看原文件,對(duì)比后面操作
cat readme.txt | sed '1s/ee/EE/'
##指定對(duì)第1行進(jìn)行操作,1s之間加空格最好,1空格s:1 s
cat readme.txt | sed '1~3s/ee/EE/'
##從第1行開始,每隔3行,即1,4,7行,1~3s和第3行沒關(guān)(自己剛開始不理解)
##第4行:Please fEEl free to contact with me( email to jmzeng1314@163.com )
##只處理第一處,即原來(lái)的feel被處理,free(第二處)沒有被處理,指定flag為2或是g

指定地址(關(guān)鍵詞)替換
###匹配模式還可以用匹配地址來(lái)替換
cat readme.txt
##查看原文件,對(duì)比后面操作
cat readme.txt | sed '/www/ s/ee/EE/'
##匹配關(guān)鍵詞

4.sed命令查看文本內(nèi)容
p:把匹配或修改過(guò)的行打印出來(lái)通常與–n參數(shù)合用(查)
###-n :禁止顯示所有輸入內(nèi)容,只顯示經(jīng)過(guò)sed處理的行(常用)
##p∶print,把匹配或修改過(guò)的行打印出來(lái),通常與–n參數(shù)合用(查)
cat readme.txt
##查看原文件,對(duì)比后面操作
cat readme.txt | grep 'ee'
###grep命令里用的,對(duì)比
cat readme.txt | sed -n '/ee/p'
##-n只顯示匹配處理的行,p就是打印的意思,-p和-n結(jié)合,打印出匹配的行,不匹配的行就不會(huì)被打?。@示)出來(lái)

grep,sed,awk三駕馬車都是按一行行的順序來(lái)處理文本。
練習(xí)題 :
1. 使用 head 查看 example.gtf 文件
head Data/example.gtf |less -s
2. 將 1 的結(jié)果傳遞給 sed ,并將 HAVANA 替換為 ENSEMBL
head Data/example.gtf | sed 's/HAVANA/ENSEMBL/' |less -S
##改的是一整行就用c命令,如果改的是一個(gè)字符就用y命令
3. 使用head查看 example.fa 文件,結(jié)果傳遞給 sed , 取第2行之后的互補(bǔ)序列,并保存到新文件中
head Data/example.fa
head Data/example.fa | sed '2,$ y/ATCG/TAGC/'
##注意理解兩點(diǎn),第二行之后,就是第2行到最后一行,需要用到$符號(hào);取的是互補(bǔ)序列ATCG分別的互補(bǔ)TAGC,之后查看前后幾個(gè)堿基,看是否匹配上。
cat | head Data/example.fa | sed '2,$ y/ATCG/TAGC/'>Exa.fa
##保存到新文件Exa.fa中
4. 搜索一下,sed 如何做大小寫轉(zhuǎn)換
首先到網(wǎng)上搜索,
cat readme.txt | sed 's/[a-z]/\u&/g'
##第一次嘗試,把所有的字母都變成大寫
##多去試試
補(bǔ)充知識(shí):
-i#參數(shù)
sed 's/[a-z]/\u&/g' readme.txt
sed -i 's/[a-z]/\u&/g' readme.txt
##-i的作用是把修改后的結(jié)果寫到文件里,不打印到屏幕里,沒有提示過(guò)程
cat readme.txt
##文件已經(jīng)被修改過(guò)了。
##注意:如果一旦修改了,發(fā)現(xiàn)不對(duì)就不好搞整,所以原始文件不要輕易修改
rm#命令
#一旦把文件刪了就很難恢復(fù),建議初學(xué)者先不要用rm這個(gè)方法
#可以用mv這個(gè)命令
mkdir
mv readme.txt tmp/
ls tmp/
##這個(gè)方法非常適合初學(xué)者去用
##可以把不要的文件或是文本都移到一個(gè)tmp文件,定期一個(gè)星期或是一個(gè)月再去清理
需要了解sed其它參數(shù)的用法在Linux里搜索幫助文檔:man sed

或是網(wǎng)頁(yè)搜索:https://linux.die.net/man/1/sed
說(shuō)明:
以上內(nèi)容主要是跟著生信技能樹的教學(xué)視頻和課件內(nèi)容學(xué)習(xí)做的筆記,小郭老師講得很詳細(xì),舉一反三,方便記憶和理解。