您好,登錄后才能下訂單哦!
這篇文章主要介紹了sed -i命令怎么使用的相關(guān)知識(shí),內(nèi)容詳細(xì)易懂,操作簡(jiǎn)單快捷,具有一定借鑒價(jià)值,相信大家閱讀完這篇sed -i命令怎么使用文章都會(huì)有所收獲,下面我們一起來(lái)看看吧。
sed 全名為 stream editor,流編輯器,用程序的方式來(lái)編輯文本,功能相當(dāng)?shù)膹?qiáng)大。是貝爾實(shí)驗(yàn)室的 Lee E.McMahon 在 1973 年到 1974 年之間開(kāi)發(fā)完成,目前可以在大多數(shù)操作系統(tǒng)中使用,sed 的出現(xiàn)作為 grep 的繼任者。與vim等編輯器不同,sed 是一種非交互式編輯器(即用戶不必參與編輯過(guò)程),它使用預(yù)先設(shè)定好的編輯指令對(duì)輸入的文本進(jìn)行編輯,完成之后再輸出編輯結(jié)構(gòu)。sed 基本上就是在玩正則模式匹配,所以,玩sed的人,正則表達(dá)式一般都比較強(qiáng)。
sed會(huì)一次處理一行內(nèi)容。處理時(shí),把當(dāng)前處理的行存儲(chǔ)在臨時(shí)緩沖區(qū)中,成為"模式空間",接著用sed命令處理緩沖區(qū)中的內(nèi)容,處理完成后,把緩沖區(qū)的內(nèi)容送往屏幕。接著處理下一行,這樣不斷重復(fù),直到文件末尾。文件內(nèi)容并沒(méi)有改變,除非你使用重定向存儲(chǔ)輸出。
在編寫(xiě)處理字符串的程序或網(wǎng)頁(yè)時(shí),經(jīng)常會(huì)有查找符合某些復(fù)雜規(guī)則的字符串的需要。正則表達(dá)式就是用于描述這些規(guī)則的工具,換句話說(shuō),正則表達(dá)式就是記錄文本規(guī)則的代碼。許多程序設(shè)計(jì)語(yǔ)言都支持利用正則表達(dá)式進(jìn)行字符串操作。在很多文本編輯器里,正則表達(dá)式通常被用來(lái)檢索、替換那些符合某個(gè)模式的文本。
簡(jiǎn)單描述一下正則表達(dá)式的匹配過(guò)程,就是拿正則表達(dá)式所表示的字符串去和原文字符串內(nèi)容去匹配,直到匹配到原文內(nèi)容字符串中的一個(gè)完整子串就表示匹配成功。舉個(gè)例子,有一行文件內(nèi)容"this is better desk",這里用"esk"去匹配,匹配過(guò)程是這樣的:首先拿e去匹配文件行內(nèi)容,從this開(kāi)始,直到better的e,第一個(gè)字符匹配成功,接著s去匹配better字符e后邊的t字符,沒(méi)有匹配成功;然后重新拿esk中的e去和better的第二個(gè)t去匹配,沒(méi)有成功,接著原始內(nèi)容的下一個(gè)字符,直到desk中的e字符,逐個(gè)匹配s,k字符,到此為止,esk成功匹配,正則表達(dá)式匹配完畢,整個(gè)過(guò)程就是這樣,即使再?gòu)?fù)雜的正則表達(dá)式的匹配過(guò)程也是按照此過(guò)程來(lái)進(jìn)行的。
[root@www ~]# sed [-nefr] [動(dòng)作]
選項(xiàng)與參數(shù):
-n :使用安靜(silent)模式。在一般 sed 的用法中,所有來(lái)自 STDIN 的數(shù)據(jù)一般都會(huì)被列出到終端上。但如果加上 -n 參數(shù)后,則只有經(jīng)過(guò)sed 特殊處理的那一行(或者動(dòng)作)才會(huì)被列出來(lái)。
-e :直接在命令列模式上進(jìn)行 sed 的動(dòng)作編輯;
-f :直接將 sed 的動(dòng)作寫(xiě)在一個(gè)文件內(nèi), -f filename 則可以運(yùn)行 filename 內(nèi)的 sed 動(dòng)作;
-r :sed 的動(dòng)作支持的是延伸型正規(guī)表示法的語(yǔ)法。(默認(rèn)是基礎(chǔ)正規(guī)表示法語(yǔ)法)
-i :直接修改讀取的文件內(nèi)容,而不是輸出到終端。
動(dòng)作說(shuō)明: [n1[,n2]]function
n1, n2 :不見(jiàn)得會(huì)存在,一般代表『選擇進(jìn)行動(dòng)作的行數(shù)』,舉例來(lái)說(shuō),如果我的動(dòng)作是需要在 10 到 20 行之間進(jìn)行的,則『 10,20[動(dòng)作行為] 』
function:
a :新增, a 的后面可以接字串,而這些字串會(huì)在新的一行出現(xiàn)(目前的下一行)~
c :取代, c 的后面可以接字串,這些字串可以取代 n1,n2 之間的行!
d :刪除,因?yàn)槭莿h除啊,所以 d 后面通常不接任何咚咚;
i :插入, i 的后面可以接字串,而這些字串會(huì)在新的一行出現(xiàn)(目前的上一行);
p :列印,亦即將某個(gè)選擇的數(shù)據(jù)印出。通常 p 會(huì)與參數(shù) sed -n 一起運(yùn)行~
s :取代,可以直接進(jìn)行取代的工作哩!通常這個(gè) s 的動(dòng)作可以搭配正規(guī)表示法!例如 1,20s/old/new/g 就是啦!
sed -i 就是直接對(duì)文本文件進(jìn)行操作的
sed -i 's/原字符串/新字符串/' /home/1.txt
sed -i 's/原字符串/新字符串/g' /home/1.txt
這兩條命令的區(qū)別就是,看示例吧
這是1.txt的內(nèi)容
#cat 1.txt
d
ddd
#ff
再看執(zhí)行這兩條命令的區(qū)別吧
sed -i 's/d/7523/' /home/1.txt
執(zhí)行結(jié)果
7523
7523dd
#ff
sed -i 's/d/7523/g' /home/1.txt
執(zhí)行結(jié)果
7523
752375237523
#ff
去掉 “行首” 帶“@”的首字母@
sed -i 's/^@//' file
特定字符串的行前插入新行
sed -i '/特定字符串/i 新行字符串' file
特定字符串的行后插入新行
sed -i '/特定字符串/a 新行字符串' file
特定字符串的刪除
sed -i '/字符串/d' file
關(guān)于正則表達(dá)式的內(nèi)容挺多的,掌握好下文中提及的內(nèi)容就能滿足正常工作中的需要,如果是專門(mén)做正則編程的,可以去買本正則表達(dá)式的書(shū)籍來(lái)看好了^_^。只有多動(dòng)手多練習(xí),才是學(xué)開(kāi)發(fā)編程的最好姿勢(shì)。
匹配任意一個(gè)字符,除了換行符,但是需要注意的是,在sed中不能匹配換行符,但是在awk中可以匹配換行符。類似shell通配符中的"?",匹配一個(gè)任意字符。
"*"表示前邊字符有0個(gè)或多個(gè)。".*"表示任意一個(gè)字符有0個(gè)或多個(gè),也就是能匹配任意的字符。類似shell通配符中的"*",可以匹配任意字符。
"[ ]"中括號(hào)中可以包含表示字符集的表達(dá)式。使用方法大概有如下幾種。
[a-z]:表示a-z字符中的一個(gè),也就是小寫(xiě)字母。
[0-9]:表示0-9字符中的一個(gè),也就是表示數(shù)字。
[A-Z]:表示大寫(xiě)字母。
[a-zA-Z]:表示字符集為小寫(xiě)字母或者大寫(xiě)字母。
[a-zA-Z0-9]:表示普通字符,包括大小寫(xiě)字母和數(shù)字。
[abc]:表示字符a或者字符b或者字符c。
[^0-9]:表示非數(shù)字類型的字符,^表示取反意思,只能放在中括號(hào)的開(kāi)始處才有意義。
[-cz]:表示字符-或者字符c或者字符z,注意與[c-z]的區(qū)別,因?yàn)?符號(hào)沒(méi)有放在e和f之間。
"^"表示行首的意思,也就是每一行的開(kāi)始位置。在這里并不是上邊字符范圍中取反的意思,^符號(hào)只有在"[]"符號(hào)的開(kāi)頭處才能表示字符取反。
^abc:表示以abc開(kāi)頭的字符串a(chǎn)bc。
^abc.*:表示以abc開(kāi)頭的字符串a(chǎn)bcxxx。
"$"表示行尾的意思,也就是每一行的結(jié)尾位置,很好理解,和"^"正好相反。
world$:表示以world結(jié)尾的字符串world,如果該行中間有world字符串是不符合匹配條件的。
^$:表示空行。行首和行尾沒(méi)有內(nèi)容,可不就是空行嘛。
"\"表示是轉(zhuǎn)義字符,和其它語(yǔ)言中用到的轉(zhuǎn)義字符意義基本上是一樣的。其實(shí)簡(jiǎn)單理解,就是把元字符轉(zhuǎn)義為普通字符,比如"\\"表示普通符號(hào)"\",把普通字符轉(zhuǎn)換為特殊意義符號(hào),比如"\n"表示把普通字符n轉(zhuǎn)義為換行符。
"{}"表示前邊字符的數(shù)量范圍,大概有三種用法,其實(shí)容易理解,看例子就知道了,但是必須注意要加上轉(zhuǎn)義字符"\",否則不生效,表示為普通字符"{"或"}"。
\{2\}:表示前邊字符的重復(fù)次數(shù)是2。
\{2,\}:表示前邊字符的重復(fù)次數(shù)至少是2,也就是大于等于2。
\{2,9\}:表示前邊字符的重復(fù)次數(shù)大于2但小于9。
"\<"表示匹配條件為詞首的位置,理解上可以對(duì)比 "^" 行首。
舉個(gè)例子,"nihao 1hello 2hello3 hello4"有這么內(nèi)容的一行內(nèi)容。
"\<hello"匹配結(jié)果"nihao 1hello 2hello3 hello4";
"hello\>"匹配結(jié)果"nihao 1hello 2hello3 hello4",這種匹配方式用的不是太多,用到會(huì)用就OK。
擴(kuò)展正則表達(dá)式是在基本正則表達(dá)式中擴(kuò)展出來(lái)的,內(nèi)容不是很多,使用頻率上可能沒(méi)有基本正則表達(dá)式那么高,但是擴(kuò)展正則依然很重要,很多情況下沒(méi)有擴(kuò)展正則是搞不定的。sed命令使用擴(kuò)展正則需要加上選項(xiàng)-r。
"?":表示前置字符有0個(gè)或1個(gè)。
"+":表示前置字符有1個(gè)或多個(gè)。
"|":表示指明兩項(xiàng)之間的一個(gè)選擇。
abc|ABC:表示可以匹配abc或者ABC。
"()"表示分組,類似算數(shù)表達(dá)式中的()。子命令表達(dá)式中可以通過(guò)\1,\2,\3等來(lái)表示分組匹配到的內(nèi)容。其實(shí)"()"也可以在基本正則表達(dá)式中使用的。
(a|b)b:表示可以匹配ab或者bb字串
([0-9])|([0][0-9])|([1][0-9]):表示匹配0-9或者00-09或者10-19范圍的字符。
這里的"{}"和基本正則表達(dá)式中的大括號(hào)意義是一樣的,只不過(guò)在使用時(shí)不用加"\"轉(zhuǎn)義符號(hào)。
字符類
[Ww]hat \.H[12345]
字符的范圍
[a-z] [0-9] [Cc]hapter[1-9] [-+*/] [0-1][0-9][-/][0-3][0-9][-/][0-9][0-9]
排除字符類
[^0-9]
重復(fù)出現(xiàn)的字符
[15]0* [15]00
字符的跨度
*與\{n,m\}
電話號(hào)碼的匹配
[0-9]\{3\}-[0-9]\{7,8\}
分組操作
compan(y|ies)
sed [選項(xiàng)] ‘command’ 文件名稱
選項(xiàng)部分,常見(jiàn)選項(xiàng)包括-n,-e,-i,-f,-r選項(xiàng)。
command部分包括:[地址1,地址2] [函數(shù)] [參數(shù)(標(biāo)記)]
選項(xiàng)-n
sed默認(rèn)會(huì)把模式空間處理完畢后的內(nèi)容輸出到標(biāo)準(zhǔn)輸出,也就是輸出到屏幕上,加上-n選項(xiàng)后被設(shè)定為安靜模式,也就是不會(huì)輸出默認(rèn)打印信息,除非子命令中特別指定打印選項(xiàng),則只會(huì)把匹配修改的行進(jìn)行打印。
例子1:
echo -e 'hello world\nnihao' | sed 's/hello/A/'
結(jié)果:
A world
nihao
例子2:
echo -e 'hello world\nnihao' | sed -n 's/hello/A/'
結(jié)果:加-n選項(xiàng)后什么也沒(méi)有顯示。
例子3:
echo -e 'hello world\nnihao' | sed -n 's/hello/A/p'
結(jié)果:A world/
說(shuō)明:-n選項(xiàng)后,再加p標(biāo)記,只會(huì)把匹配并修改的內(nèi)容打印了出來(lái)。
選項(xiàng)-e
如果需要用sed對(duì)文本內(nèi)容進(jìn)行多種操作,則需要執(zhí)行多條子命令來(lái)進(jìn)行操作。
例子1:
echo -e 'hello world' | sed -e 's/hello/A/' -e 's/world/B/'
結(jié)果:A B
例子2:
echo -e 'hello world' | sed 's/hello/A/;s/world/B/'
結(jié)果:A B
說(shuō)明:例子1和例子2的寫(xiě)法的作用完全等同,可以根據(jù)喜好來(lái)選擇,如果需要的子命令操作比較多的時(shí)候,無(wú)論是選擇-e選項(xiàng)方式,還是選擇分號(hào)的方式,都會(huì)使命令顯得臃腫不堪,此時(shí)使用-f選項(xiàng)來(lái)指定腳本文件來(lái)執(zhí)行各種操作會(huì)比較清晰明了。
選項(xiàng)-i
sed默認(rèn)會(huì)把輸入行讀取到模式空間,簡(jiǎn)單理解就是一個(gè)內(nèi)存緩沖區(qū),sed子命令處理的內(nèi)容是模式空間中的內(nèi)容,而非直接處理文件內(nèi)容。因此在sed修改模式空間內(nèi)容之后,并非直接寫(xiě)入修改輸入文件,而是打印輸出到標(biāo)準(zhǔn)輸出。如果需要修改輸入文件,那么就可以指定-i選項(xiàng)。
例子1:
cat file.txt
hello world
[root@localhost]# sed 's/hello/A/' file.txt
A world
[root@localhost]# cat file.txt
hello world
例子2:
[root@localhost]# sed -i 's/hello/A/' file.txt
[root@localhost]# cat file.txt
A world
例子3:
[root@localhost]# sed –i.bak 's/hello/A/' file.txt
說(shuō)明:最后一個(gè)例子會(huì)把修改內(nèi)容保存到file.txt,同時(shí)會(huì)以file.txt.bak文件備份原來(lái)未修改文件內(nèi)容,以確保原始文件內(nèi)容安全性,防止錯(cuò)誤操作而無(wú)法恢復(fù)原來(lái)內(nèi)容。
選項(xiàng)-f
還記得 -e 選項(xiàng)可以來(lái)執(zhí)行多個(gè)子命令操作,用分號(hào)分隔多個(gè)命令操作也是可以的,如果命令操作比較多的時(shí)候就會(huì)比較麻煩,這時(shí)候把多個(gè)子命令操作寫(xiě)入腳本文件,然后使用 -f 選項(xiàng)來(lái)指定該腳本。
例子1:
echo "hello world" | sed -f sed.script
結(jié)果:A B
sed.script腳本內(nèi)容:
s/hello/A/
s/world/B/
說(shuō)明:在腳本文件中的子命令串就不需要輸入單引號(hào)了。
選項(xiàng)-r
sed命令的匹配模式支持正則表達(dá)式的,默認(rèn)只能支持基本正則表達(dá)式,如果需要支持?jǐn)U展正則表達(dá)式,那么需要添加-r選項(xiàng)。
例子1:
echo "hello world" | sed -r 's/(hello)|(world)/A/g'
A A
默認(rèn)情況下sed會(huì)對(duì)每一行內(nèi)容進(jìn)行匹配、處理、輸出,某些情況不需要對(duì)處理的文本全部編輯,只需要其中的一部分,比如1-10行,偶數(shù)行,或者是包含"hello"字符串的行,這種情況下就需要我們?nèi)ザㄎ惶囟ǖ男衼?lái)處理,而不是全部?jī)?nèi)容,這里把這個(gè)定位指定的行叫做"定址"。
數(shù)字定址其實(shí)就是通過(guò)數(shù)字去指定具體要操作編輯的行,數(shù)字定址有幾種方式,每種方式都有不同的應(yīng)用場(chǎng)景,下邊以舉例的方式來(lái)描述每種數(shù)字定址的用法。
例子1:
sed –n ‘4s/hello/A/’ message
說(shuō)明:將第4行中hello字符串替換為A,其它行如果有hello也不會(huì)被替換。
例子2:
sed –n ‘2,4s/hello/A/’ message
說(shuō)明:將第2-4行中hello字符串替換為A,其它行如果有hello也不會(huì)被替換。
例子3:
sed –n ‘2,+4s/hello/A/’ message
說(shuō)明:從第2行開(kāi)始,再接著往下數(shù)4行,也就是2-6行,這些行會(huì)把hello字符替換為A。
例子4:
sed –n ‘4,~3s/hello/A/’ message
說(shuō)明:第4行開(kāi)始,到第6行。解釋6的由來(lái),"4,~3"表示從4行開(kāi)始到下一個(gè)3的倍數(shù),這里從4開(kāi)始算,那就是6了,當(dāng)然9就不是了,因?yàn)槭且?的第一個(gè)超過(guò)前邊數(shù)字4的倍數(shù),感覺(jué)這種適用場(chǎng)景不會(huì)太多。
例子5:
sed –n ‘4~3s/hello/A/’ message
說(shuō)明:從第4行開(kāi)始,每隔3行就把hello替換為A。比如從4行開(kāi)始,7行,10行等依次+3行。這個(gè)比較常用,比如3替換為2的時(shí)候,也就是每隔2行的步調(diào),可以實(shí)現(xiàn)奇數(shù)和偶數(shù)行的操作。
例子6:
sed –n ‘$s/hello/A/’ message
說(shuō)明:$符號(hào)表示最后一行,和正則中的$符號(hào)類似,但是第1行不用^表示,直接1就行了。
例子7:
sed -n ‘1!s/hello/A/’ message
說(shuō)明:!符號(hào)表示取反,該命令是將除了第1行,其它行hello替換為A,上述定址方式也可以使用!符號(hào)。
正則定址使用目的和數(shù)字定址完全一樣,使用方式上有所不同,是通過(guò)正則表達(dá)式的匹配來(lái)確定需要處理編輯哪些行,其它行就不需要額外處理。
例子1:
sed -n ‘/nihao/d’ message
說(shuō)明:將匹配到nihao的行執(zhí)行刪除操作。
例子2:
sed -n ‘/^$/d’ message
說(shuō)明:刪除空行
例子3:
sed -n ‘/^TS/,/^TE/d’ message
說(shuō)明:匹配以TS開(kāi)頭的行到TE開(kāi)頭的行之間的行,把匹配到的這些行刪除。
其實(shí)數(shù)字定址和正則定址可以配合使用,參考下邊的例子。
例子1:
sed -n ‘1,/^TS/d’ message
說(shuō)明:匹配從第1行到TS開(kāi)頭的行,把匹配的行刪除。
例子1:
/^TS/,/^TE/{
s/CN/China/
s/Beijing/BJ/
}
說(shuō)明:該命令表示將從TS開(kāi)頭的行到TE開(kāi)頭的行之間范圍的行內(nèi)容中CN替換為China,并且把Beijing替換為BJ,類似于多命令之間用分號(hào)的那種方式,不過(guò)這樣定址代碼只寫(xiě)了一遍,相當(dāng)于執(zhí)行了一條子命令。
例子2:
sed -n ‘2,3s{/cn/china/;/a/b/}’ message
說(shuō)明:效果類似例子1,有點(diǎn)數(shù)學(xué)上的乘法分配率的意思。
sed 默認(rèn)的命令執(zhí)行范圍是全局編輯的,如果不明確指定行的話,命令會(huì)在所有輸入行上執(zhí)行,如果想僅對(duì)其中部分行執(zhí)行命令,可以使用地址限制。如果給了 2 個(gè)地址,即地址對(duì)(地址范圍),則命令匹配的這個(gè)地址范圍內(nèi)執(zhí)行,但是需要注意的是:對(duì)于像 "addr1,addr2" 這種形式的地址匹配,如果addr1 匹配,則匹配成功,"開(kāi)關(guān)"打開(kāi),在該行上執(zhí)行命令,此時(shí)不管 addr2 是否匹配,即使 addr2 在 addr1 這一行之前;接下來(lái)讀入下一行,如果addr2 匹配,則執(zhí)行命令,同樣開(kāi)關(guān)"關(guān)閉";如果 addr2 在 addr1 之后,則一直處理到匹配為止,換句話說(shuō),如果 addr2 一直不匹配,則開(kāi)關(guān)一直不關(guān)閉,因此會(huì)持續(xù)執(zhí)行命令到最后一行。
子命令a表示在指定行下邊插入指定行的內(nèi)容。
例子1:
sed ‘a A’ message
說(shuō)明:將message文件中每一行下邊都插入添加一行內(nèi)容是A。
例子2:
sed ‘1,2a A’ message
說(shuō)明:將message文件中1-2行的下邊插入添加一行內(nèi)容是A
例子3:
sed ‘1,2a A\nB\nC’ message
說(shuō)明:將message文件中1-2行的下邊分別添加3行,3行內(nèi)容分別是A、B、C,這里使用了\n,插入多行內(nèi)容都可以按照這種方式來(lái)實(shí)現(xiàn)。
子命令i和a使用上基本上一樣,只不過(guò)是在指定行上邊插入指定行的內(nèi)容。
例子1:
sed ‘i A’ message
說(shuō)明:將message文件中每一行上邊都插入添加一行內(nèi)容是A。
例子2:
sed ‘1,2i A’ message
說(shuō)明:將message文件中1-2行的上邊插入添加一行內(nèi)容是A
例子3:
sed ‘1,2i A\nB\nC’ message
說(shuō)明:將message文件中1-2行的上邊分別添加3行,3行內(nèi)容分別是A、B、C,這里使用了\n,插入多行內(nèi)容都可以按照這種方式來(lái)實(shí)現(xiàn)。
子命令c是表示把指定的行內(nèi)容替換為自己需要的行內(nèi)容。
例子1:
sed ‘c A’ message
說(shuō)明:將message文件中所有的行內(nèi)容都分別替換為A行內(nèi)容。
例子2:
sed ‘1,2c A’ message
說(shuō)明:將message文件中1-2行的內(nèi)容替換為A,注意這里說(shuō)的是將1-2行所有的內(nèi)容只替換為一個(gè)A內(nèi)容,也就是1-2行內(nèi)容編程了一行,定址如果連續(xù)就是這種情況。如果想把1-2行分別替換為A,可以參考下個(gè)例子的方式。
例子3:
sed ‘1,2c A\nA’ message
說(shuō)明:將message中1-2行內(nèi)容分別替換為了A,需要在替換內(nèi)容上手動(dòng)加換行\(zhòng)n,這樣當(dāng)然也可以將一行內(nèi)容替換為多行內(nèi)容。
子命令d表示刪除指定的行內(nèi)容,比較簡(jiǎn)單,更容易理解。
例子1:
sed ‘d’ message
說(shuō)明:將message所有行全部刪除,因?yàn)闆](méi)有加定址表達(dá)式,所以平時(shí)如果需要?jiǎng)h除指定行內(nèi)容,需要在子命令前加定址表達(dá)式。
例子2:
sed ‘1,3d’ message
說(shuō)明:將message文件中1-3行內(nèi)容刪除。
子命令y表示字符替換,可以替換多個(gè)字符,只能替換字符不能替換字符串,且不支持正則表達(dá)式,具體使用方法看例子。
例子1:
sed ‘y/ab/AB/’ message
說(shuō)明:把message中所有a字符替換為A符號(hào),所有b字符替換為B符號(hào)。
強(qiáng)調(diào)一下,這里的替換源字符個(gè)數(shù)和目的字符個(gè)數(shù)必須相等;字符不支持正則表達(dá)式;源字符和目標(biāo)字符每個(gè)字符需要一一對(duì)應(yīng)。
子命令=,可以將行號(hào)打印出來(lái)。
例子:
sed ‘1,2=’ message
結(jié)果:
1
nihao
2
hello world
說(shuō)明:將指定行的上邊顯示行號(hào)。
子命令r,類似于a,也是將內(nèi)容追加到指定行的后邊,只不過(guò)r是將指定文件內(nèi)容讀取并追加到指定行下邊。
例子1:
sed ‘2r a.txt’ message
說(shuō)明:將a.txt文件內(nèi)容讀取并插入到message文件第2行的下邊。
子命令s為替換子命令,是平時(shí)sed使用的最多的子命令,沒(méi)有之一。因?yàn)橹С终齽t表達(dá)式,功能變得強(qiáng)大無(wú)比,下邊來(lái)詳細(xì)地說(shuō)說(shuō)子命令s的使用方法。
基本語(yǔ)法:
[address]s/pattern/replacement/flags
s字符串替換,替換的時(shí)候可以把/換成其它的符號(hào),比如=,replacement部分用下列字符會(huì)有特殊含義:
>>> &:用正則表達(dá)式匹配的內(nèi)容進(jìn)行替換
>>> \n:回調(diào)參數(shù)
>>> \(\):保存被匹配的字符以備反向引用\n時(shí)使用,最多9個(gè)標(biāo)簽,標(biāo)簽書(shū)序從左到右
Flags
>>> n:可以是1-512,表示第n次出現(xiàn)的情況進(jìn)行替換
>>> g:全局更改
>>> p:打印模式空間的內(nèi)容
>>> w file:寫(xiě)入到一個(gè)文件file中
測(cè)試文件:
# cat message
hello 123 world
例子1:
sed ‘s/hello/HELLO/’ message
說(shuō)明:將message每行包含的第一個(gè)hello的字符串替換為HELLO,這是最基本的用法。
例子2:
sed -r ‘s/[a-z]+ [0-9]+ [a-z]+/A/’ message
結(jié)果:A
說(shuō)明:使用了擴(kuò)展正則表達(dá)式,需要加-r選項(xiàng)。
例子3:
sed -r ‘s/([a-z]+)( [0-9]+ )([a-z]+)/\1\2\3/’ message
結(jié)果:hello 123 world
說(shuō)明:再看下一個(gè)例子就明白了。
例子4:
sed -r ‘s/([a-z]+)( [0-9]+ )([a-z]+)/\3\2\1/’ message
結(jié)果:world 123 hello
說(shuō)明:\1表示正則第一個(gè)分組結(jié)果,\2表示正則匹配第二個(gè)分組結(jié)果,\3表示正則匹配第三個(gè)分組結(jié)果。
例子5:
sed -r ‘s/([a-z]+)( [0-9]+ )([a-z]+)/&/’ message
結(jié)果:hello 123 world
說(shuō)明:&表示正則表達(dá)式匹配的整個(gè)結(jié)果集。
例子6:
sed -r ‘s/([a-z]+)( [0-9]+ )([a-z]+)/111&222/’ message
結(jié)果:111hello 123 world222
說(shuō)明:在匹配結(jié)果前后分別加了111、222。
例子7:
sed -r ‘s/.*/111&222/’ message
說(shuō)明:在message文件中每行的首尾分別加上111、222。
例子8:
sed ‘s/i/A/g’ message
說(shuō)明:把message文件中每行的所有i字符替換為A,默認(rèn)不加g標(biāo)記時(shí)只替換每行的第一個(gè)字符。
例子9:
sed ‘s/i/A/2’ message
說(shuō)明:把message文件中每行的第2個(gè)i字符替換為A。
例子10:
sed -n ‘s/i/A/p’ message
說(shuō)明:加-p標(biāo)記會(huì)把被替換的行打印出來(lái),再加上-n選項(xiàng)會(huì)關(guān)閉模式空間打印模式,因此該命令的效果就是只顯示被替換修改的行。
例子11:
sed -n ‘s/i/A/w b.txt’ message
說(shuō)明:把message文件中內(nèi)容的每行第一個(gè)字符i替換為A,然后把修改內(nèi)容另存為b.txt文件。
例子12:
sed -n ‘s/i/A/i’ message
說(shuō)明:把message文件中每一行的第一個(gè)i或I字符替換為A字符,也即是忽略大小寫(xiě)。
模式空間初始化為空,處理完一行后會(huì)自動(dòng)輸出到屏幕并清除模式空間;保持空間初始化為一個(gè)空行,也就是默認(rèn)帶一個(gè)\n,處理完后不會(huì)自動(dòng)清除。模式空間和保持空間,從程序的角度去看,其實(shí)就是sed在工作的時(shí)候占用了一些內(nèi)存空間和地址,sed工作完畢就會(huì)把內(nèi)存釋放并歸還給操作系統(tǒng)。
大概簡(jiǎn)單描述一下sed的工作流程,讀取文件的一行,存入模式空間,然后進(jìn)行所有子命令的處理,處理完后默認(rèn)會(huì)將模式空間的內(nèi)容輸出打印到標(biāo)準(zhǔn)輸出,也就是在屏幕上顯示出來(lái),接著清空模式空間的內(nèi)存,繼續(xù)讀取下一行的內(nèi)容到模式空間,繼續(xù)處理,依次循環(huán)處理。
h:把模式空間內(nèi)容覆蓋到保持空間中
H:把模式空間內(nèi)容追加到保持空間中
g:把保持空間內(nèi)容覆蓋到模式空間中
G:把保持空間內(nèi)容追加到模式空間中
x:交換模式空間與保持空間的內(nèi)容
測(cè)試文件:
# cat test.txt
11111
22222
33333
44444
例子1:
sed ‘{1h;2,3H;4G}’ test.txt
結(jié)果:
11111
22222
33333
44444
11111
22222
33333
解釋說(shuō)明:略。懶得寫(xiě)了。
例子2:
sed ‘{1h;2x;3g;$G}’ test.txt
結(jié)果:
11111
11111
22222
44444
22222
解釋說(shuō)明:略。
例子3:
sed ‘{1!G;h;$!d}’ test.txt
結(jié)果:
44444
33333
22222
11111
高級(jí)子命令比較少,但是比較復(fù)雜,平時(shí)用的也會(huì)相對(duì)少些,卻也很重要,有的內(nèi)容處理不用高級(jí)子命令是完成不了的。
n:讀入下一行到模式空間,例:’4{n;d}’ 刪除第5行。
N:追加下一行到模式空間,再把當(dāng)前行和下一行同時(shí)應(yīng)用后面的命令。
P:輸出多行模式空間的第一部分,直到第一個(gè)嵌入的換行符位置。在執(zhí)行完腳本的最后一個(gè)命令之后,模式空間的內(nèi)容自動(dòng)輸出。P命令經(jīng)常出現(xiàn)在N命令之后和D命令之前。
D:刪除模式空間中第一個(gè)換行符的內(nèi)容。它不會(huì)導(dǎo)致讀入新的輸入行,相反,它返回到腳本的頂端,將這些指令應(yīng)用與模式空間剩余的內(nèi)容。這3個(gè)命令能建立一個(gè)輸入、輸出循環(huán),用來(lái)維護(hù)兩行模式空間,但是一次只輸出一行。
例子1:
sed ‘N;$!P;D’ a.txt
#說(shuō)明:刪除文件倒數(shù)第二行
例子2:
sed ‘N;$!P;$!D;$d’ a.txt
# 說(shuō)明:刪除文件最后兩行
分支命令用于無(wú)條件轉(zhuǎn)移,測(cè)試命令用于有條件轉(zhuǎn)移。
跳轉(zhuǎn)的位置與標(biāo)簽相關(guān)聯(lián)。
如果有標(biāo)簽則跳轉(zhuǎn)到標(biāo)簽所在的后面行繼續(xù)執(zhí)行。
如果沒(méi)有標(biāo)簽則跳轉(zhuǎn)到腳本的結(jié)尾處。
標(biāo)簽:以冒號(hào)開(kāi)始后接標(biāo)簽名,不要在標(biāo)簽名前后使用空格。
測(cè)試文件:
grep seker /etc/passwd
seker:x:500:500::/home/seker:/bin/bash
例子1:
grep seker /etc/passwd | sed ‘:top;s/seker/blues/;/seker/b top;s/5/555/’
結(jié)果:blues:x:55500:500::/home/blues:/bin/bash
選擇執(zhí)行
例子2:
grep ‘seker’ /etc/passwd | sed ‘s/seker/blues/;/seker/b end;s/5/555/;:end;s/5/666/’
結(jié)果:blues:x:66600:500::/home/seker:/bin/bash
測(cè)試命令,如果前一個(gè)替換命令執(zhí)行成功則跳轉(zhuǎn)到腳本末尾(case結(jié)構(gòu))
例子3:
grep ‘seker’ /etc/passwd | sed ‘s/seker/ABC;t;s/home/DEF/;t;s/bash/XYZ/’
結(jié)果:ABC:x:500:500::/home/seker:/bin/bash
例子4:
grep ‘zorro’ /etc/passwd | sed ‘s/seker/ABC/;t;s/home/DEF/;t;s/bash/XYZ’
結(jié)果:zorro:x:500:500::/DEF/zorro:/bin/bash
與標(biāo)簽關(guān)聯(lián),跳轉(zhuǎn)到標(biāo)簽位置。
例子5:
grep ‘seker’ /etc/passwd | sed ‘s/seker/ABC/;t end;s/home/DEF/;t;end;s/bash/XYZ’
結(jié)果:ABC:x:500:500::/home/seker:/bin/XYZ
實(shí)例1:刪除文件每行的第二個(gè)字符。
sed -r 's/(.*)(.)$/\1/'
實(shí)例2:刪除文件每行的最后一個(gè)字符。
sed -r 's/(.*)(.)$/\1/'
實(shí)例3:刪除文件每行的倒數(shù)第2個(gè)單詞。
sed -r ‘s/(.*)([^a-Z]+)([a-Z]+)([^a-Z]+)([a-Z]+)([^a-Z]*$)/\1\2\4\5/’ /etc/passwd
實(shí)例4:交換每行的第一個(gè)字符和第二個(gè)字符。
sed -r ‘s/(.)(.)(.*)/\2\1\3/’ /etc/passwd
實(shí)例5:交換每行的第一個(gè)單詞和最后一個(gè)單詞。
sed -r ‘s/([a-Z]+)([^a-Z]+)(.*)([^a-Z]+)([a-Z]+)([^a-Z]*$)/\5\2\3\4\1\6/’ /etc/passwd
實(shí)例6:刪除一個(gè)文件中所有的數(shù)字。
sed ‘s/[0-9]//g’ /etc/passwd
實(shí)例7:用制表符替換文件中出現(xiàn)的所有空格。
sed -r ‘s/ +/\t/g’ /etc/passwd
實(shí)例8:把所有大寫(xiě)字母用括號(hào)()括起來(lái)。
sed -r ‘s/([A-Z])/(\1)/g’ /etc/passwd
實(shí)例9:打印每行3次。
sed ‘p;p’ /etc/passwd
實(shí)例10:隔行刪除
sed ‘0~2{=;d}’ /etc/passwd
實(shí)例11:把文件從第22行到第33行復(fù)制到56行后面。
sed ‘22h;23,33H;56G’ /etc/passwd
實(shí)例12:把文件從第22行到第33行移動(dòng)到第56行后面。
sed ‘22{h;d};23,33{H;d};56g’ /etc/passwd
實(shí)例13:只顯示每行的第一個(gè)單詞。
sed -r ‘s/([a-Z]+)([^a-Z]+)(.*)/\1/’ /etc/passwd
實(shí)例14:打印每行的第一個(gè)單詞和第三個(gè)單詞。
sed -r ‘s/([a-Z]+)([^a-Z]+)([a-Z]+)([^a-Z]+)([a-Z]+)([^a-Z]+)(.*)/\1\t\5/’ /etc/passwd
實(shí)例15:將格式為mm/yy/dd的日期格式換成 mm;yy;dd
date '+%m/%y/%d' | sed 's/\//;/g'
關(guān)于“sed -i命令怎么使用”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對(duì)“sed -i命令怎么使用”知識(shí)都有一定的了解,大家如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。