1 你想過(guò)sed為什么叫sed么?
sed是stream editor的縮寫(xiě),sed就是一個(gè)流編輯器,說(shuō)白了,就是我們往sed里輸入一串信息,它給我們處理,然后輸出來(lái)。就這么簡(jiǎn)單。
sed和cut類(lèi)似,是一個(gè)面向行處理的工具,它以“行”為處理單位,處理后的結(jié)果會(huì)輸出到標(biāo)準(zhǔn)輸出。所以說(shuō)其實(shí)sed命令很安全的,它不會(huì)對(duì)行本身所在文件做任何修改的。
sed的命令格式是:sed command file
其中,command部分是針對(duì)每行數(shù)據(jù)所做的處理(這部分很重要很重要,接著看,你會(huì)知道的),file是要處理的文件,如果忽略file參數(shù),則sed會(huì)把標(biāo)準(zhǔn)輸入作為處理對(duì)象。
2 sed的工作原理是什么?
sed會(huì)一次處理一行內(nèi)容。處理時(shí),把當(dāng)前處理的行存儲(chǔ)在臨時(shí)緩沖區(qū)中,稱(chēng)為“模式空間”(pattern space),接著用sed命令處理緩沖區(qū)中的內(nèi)容,處理完成后,把緩沖區(qū)的內(nèi)容送往屏幕。接著處理下一行,這樣不斷重復(fù),直到文件末尾。文件內(nèi)容并沒(méi)有改變,除非你使用重定向存儲(chǔ)輸出。
3 給個(gè)最最簡(jiǎn)單的sed命令的例子吧!讓我先有個(gè)感性認(rèn)識(shí),呵呵。
[rocrocket@rocrocket programming]$ cat roc.txt
test 1
test2
testtest
XtestX
BBtest
[rocrocket@rocrocket programming]$ sed ‘/2/d’ roc.txt
test 1
testtest
XtestX
BBtest
此例子是利用sed來(lái)刪除roc.txt文件里含有字符“2”的行。大家看到了,例子很簡(jiǎn)單,這個(gè)命令的command部分是/2/d,而且它是用單引號(hào)括起來(lái)的。你也一定要學(xué)著這樣做,只要用到sed,別忘了用單引號(hào)將command部分括起來(lái)。
/2/d中的d表示刪除,意思就是說(shuō)只要某行含有字符2,則刪除之。(你一定沒(méi)忘記,sed所謂的刪除都是在模式空間中執(zhí)行的,而原文件roc.txt毫發(fā)無(wú)損)
4 想實(shí)現(xiàn)類(lèi)似于cut -d : -f 1 /etc/passwd的效果,用sed怎么做呢?
(cut用法參見(jiàn)《cut命令》-linux命令五分鐘系列之十九)
[rocrocket@rocrocket programming]$ head -n 5 /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[rocrocket@rocrocket programming]$ head -n 5 /etc/passwd|sed ‘s/:.*$//’
root
bin
daemon
adm
lp
看到了吧,我們使用的command是’s/:.*$//’,其中的正則表達(dá)式s///是替換的經(jīng)典格式,如果你不太了解,可以看看我之前的一篇博客專(zhuān)題文章,講述的就是替換的藝術(shù):《vi中的替換藝術(shù)》-linux命令五分鐘系列之十一