Linux處理文本的第二駕馬車—sed命令

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 :增刪改查

aappend,在指定行的后增加一行,內(nèi)容為 a 的后面接的字串
iinsert,在指定行的前增加一行,內(nèi)容為 i 的后面接的字串
ddelete,刪除某一行或者某幾行,也可以指定刪除匹配上的行
cchange,改變指定行的內(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/'
pprint,把匹配或修改過(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
1a在第一行后增加內(nèi)容

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
1,2i表示在第一行和第二行前面分別增加內(nèi)容

結(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
sed命令-e與分別2i和2a一起增加內(nèi)容

2.sed命令除文本內(nèi)容

d:刪除某一行或者某幾行

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

刪除空白行

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

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'
sed命令修改文本內(nèi)容

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,全部替換
sed命令替換示例

以上的這張截圖自己做的注釋不清晰,補(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,全部替換
sed命令與s參數(shù)以及指定flag替換

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
sed命令y替換示例

指定路徑替換

###指定路徑或是地址來(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)鍵詞

匹配地址(關(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)
-p與-n結(jié)合使用的例子

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

查看sed的幫助文檔

或是網(wǎng)頁(yè)搜索:https://linux.die.net/man/1/sed

說(shuō)明:

以上內(nèi)容主要是跟著生信技能樹的教學(xué)視頻和課件內(nèi)容學(xué)習(xí)做的筆記,小郭老師講得很詳細(xì),舉一反三,方便記憶和理解。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容