?前言:
一、sed編輯器基本了解shell腳本最常見的一個(gè)用途就是處理文本文件。檢查日志文件、讀取配置 文件、處理數(shù)據(jù)元素,shell腳本可以幫助我們將文本文件中各種數(shù)據(jù)的日常處理任務(wù)自動(dòng)化。但僅靠shell腳本命令來處理文本文件的內(nèi)容有點(diǎn)力不從心的。如果想在shell腳本中處理任何類型的數(shù)據(jù),掌握sed和gawk工具可以達(dá)到事半功倍的效果。企業(yè)開發(fā)中常用,高階命令。
sed 編輯器被稱作 流編輯器 ( stream editor),和普通的交互式文本編輯器恰好相反。流編
輯器會(huì)在編輯器處理數(shù)據(jù)之前基于預(yù)先提供的一組規(guī)則來編輯數(shù)據(jù)流。 可以根據(jù)命令來處理數(shù)據(jù)流中的數(shù)據(jù),這些命令要么從命令行中輸入,要么存儲(chǔ) 在一個(gè)命令文本文件中。
sed編輯器執(zhí)行流程大致如下:
- 一次從輸入中讀取一行數(shù)據(jù)。
- 根據(jù)所提供的編輯器命令匹配數(shù)據(jù)。
- 按照命令修改流中的數(shù)據(jù)。
- 將新的數(shù)據(jù)輸出到STDOUT。
核心講解:
在流編輯器將所有命令與一行數(shù)據(jù)匹配完畢后,它會(huì)讀取下一行數(shù)據(jù)并重復(fù)這個(gè)過程。在流
編輯器處理完流中的所有數(shù)據(jù)行后,它就會(huì)終止。
由于命令是按順序逐行給出的, sed 編輯器只需對(duì)數(shù)據(jù)流進(jìn)行一遍處理就可以完成編輯操作。
這使得 sed 編輯器要比交互式編輯器快得多,你可以快速完成對(duì)數(shù)據(jù)的自動(dòng)修改。
有了上面核心理論的了解,下面我們就可以對(duì)sed進(jìn)行實(shí)操演練了:
sed 使用的語法格式:
sed options script file
常用參數(shù)羅列:
- -e script 在處理輸入時(shí),將script中指定的命令添加到已有的命令中
- -f file 在處理輸入時(shí),將file中指定的命令添加到已有的命令中
- -n 不產(chǎn)生命令輸出,使用print命令來完成輸出
重點(diǎn)說明:
script 參數(shù)指定了應(yīng)用于流數(shù)據(jù)上的單個(gè)命令。如果需要用多個(gè)命令,要么使用 -e 選項(xiàng)在
命令行中指定,要么使用 -f 選項(xiàng)在單獨(dú)的文件中指定。有大量的命令可用來處理數(shù)據(jù)。
1.1 在終端命令行使用單條sed命令
默認(rèn)情況下, sed 編輯器會(huì)將指定的命令應(yīng)用到 STDIN 輸入流上。這樣你可以直接將數(shù)據(jù)通
過管道輸入 sed 編輯器處理。
演示案例:
單行文本修改:
?如截圖中所見,這個(gè)例子在sed編輯器中使用了s命令。s命令會(huì)用斜線間指定的第二個(gè)文本字符串來替換第 一個(gè)文本字符串模式。在本例中是big test替換了test。
整個(gè)文本修改:
?核心講解:
在運(yùn)行上面的例子時(shí),結(jié)果都是立即就會(huì)顯示出來的。這就是使用 sed編輯器的強(qiáng)大之處。我們可以同時(shí)對(duì)文本數(shù)據(jù)做出多處修改,而需要操作的時(shí)間是及其短暫的。需要注意的一點(diǎn)的是,sed編輯器并不會(huì)修改原來文本文件的數(shù)據(jù)。它只會(huì)將修改后的數(shù)據(jù)發(fā)送到STDOUT,我們可以查看源文本的數(shù)據(jù)依舊保持不變。
?1.2 在命令行使用多個(gè)sed 命令
要在 sed 命令行上執(zhí)行多個(gè)命令時(shí),只要用 -e 選項(xiàng)就可以了。
?操作演示:
?操作詳解:
兩個(gè)命令都作用到文件中的每行數(shù)據(jù)上。命令之間必須用分號(hào)隔開,并且在命令末尾和分號(hào) 之間不能有空格。還有一種方式我們使用的很少,就是用shell中的次提示符來分隔命令,如下截圖:
?1.3?從文件中讀取編輯器命令
有時(shí)候我們有大量要處理的sed命令,此時(shí)我們就可以命令放在一個(gè)腳本文件里,文件通常以.sed 結(jié)尾,使用中我們只需要應(yīng)用 -f 參數(shù),就可以來讀取文件中命令:
核心解說:?
二、sed編輯器工作中經(jīng)常的使用如上圖,sed編輯器知道每行都是一條單獨(dú)的命令。 跟在命令行輸入命令一樣,sed編輯器會(huì)從指定文件中讀取命令,并將它們應(yīng)用到數(shù)據(jù)文件中的 每一行上。同樣達(dá)到了對(duì)文本處理的效果。
成功使用 sed 編輯器的關(guān)鍵在于掌握其各式各樣的命令和格式,它們能夠幫助你定制文本編
輯行為。本節(jié)將介紹一些可以集成到腳本中基本命令和功能。上面章節(jié)我們已經(jīng)懂得了如何用s 命令( substitute )來在行中替換文本。這個(gè)命令還有另外一些選 項(xiàng)能讓事情變得更為簡(jiǎn)單。
2.1. 替換標(biāo)記
實(shí)例展示:
上圖中可以看到替換命令在替換多行中的文本時(shí)能正常工作,但默認(rèn)情況下它只替換每行中出現(xiàn)的第一處。 要讓替換命令能夠替換一行中不同地方出現(xiàn)的文本必須使用替換標(biāo)(substitutionflag),替換標(biāo)記會(huì)在替換命令字符串之后設(shè)置。
替換標(biāo)記分類:
- 數(shù)字,表明新文本將替換第幾處模式匹配的地方;
- g,表明新文本將會(huì)替換所有匹配的文本;
- p,表明原先行的內(nèi)容要打印出來;
- w file,將替換的結(jié)果寫到文件中。
在第一類替換中,可以指定 sed 編輯器用新文本替換第幾處模式匹配的地方。
?
?對(duì)比一以上兩圖,我們可以得出結(jié)論:
將替換標(biāo)記指定為 2 的結(jié)果就是: sed 編輯器只替換每行中第二次出現(xiàn)的匹配模式。 g替換標(biāo)
記使你能替換文本中匹配模式所匹配的每處地方。?
p 替換標(biāo)記會(huì)打印與替換命令中指定的模式匹配的行。這通常會(huì)和 sed 的 -n 選項(xiàng)一起使用。
-n 選項(xiàng)將禁止 sed 編輯器輸出。但 p 替換標(biāo)記會(huì)輸出修改過的行。將二者配合使用的效果就是
只輸出被替換命令修改過的行。
如下效果圖:
w 替換標(biāo)記會(huì)產(chǎn)生和p替換標(biāo)記相同的輸出,不同的是w會(huì)將輸出保存到指定文件中。
如下效果圖:
?2.2 替換字符
有時(shí)我們會(huì)在文本字符串中遇到一些不太方便在替換模式中使用的字符。 Linux 中一個(gè)常見的
例子就是正斜線( / )。 替換文件中的路徑名會(huì)比較麻煩。
比如下面,如果想用C shell替換/etc/passwd文件中的bash shell,需要使用如下方式:
?上面我們可以發(fā)現(xiàn),由于正斜線通常用作字符串分隔符,因而如果它出現(xiàn)在了模式文本中的話,必須用反斜線來 轉(zhuǎn)義。這通常會(huì)帶來一些困惑和錯(cuò)誤。 要解決這個(gè)問題,sed編輯器允許選擇其他字符來作為替換命令中的字符串分隔符,下例中我們就是使用感嘆號(hào)用作字符串分隔符。
?2.3 sed 的尋址操作
sed 的尋址模式分為兩種:
- 以數(shù)字形式表示行區(qū)間
- 用文本模式來過濾出行
兩種尋址的語法格式是相同的,sed編輯器會(huì)將指定的每條命令作用到匹配指定地址的行上。
[address]command
或者是將特定地址的多個(gè)命令分組:
address {
command1
command2
command3
}
2.3.1 數(shù)字尋址(常用的方式)
????????當(dāng)使用數(shù)字方式的行尋址時(shí),可以用行在文本流中的行位置來引用。sed 編輯器會(huì)將文本流中的第一行編號(hào)為1 ,然后繼續(xù)按順序?yàn)榻酉聛淼男蟹峙湫刑?hào)。 在命令中指定的地址可以是單個(gè)號(hào),或是用起始行號(hào)、逗號(hào)以及結(jié)尾行號(hào)指定的一定區(qū)間范圍內(nèi)的行。
演示截圖:
a.指定行號(hào)
b.行地址區(qū)間
?c.如果想將命令作用到文本中從某行開始的所有行,可以用特殊地址$.
?2.3.2?使用文本模式過濾器(不常用)
sed 編輯器允許指定文本模式來過 濾出命令要作用的行。
格式如下:
/pattern/ command
必須用正斜線將要指定的pattern封起來。sed編輯器會(huì)將該命令作用到包含指定文本模式的行上。?
如下面給的示例:修改用戶Samantha的默認(rèn)shell,可以使用sed命令。
?核心詳解:
該命令只作用到匹配文本模式的行上。雖然使用固定文本模式能幫你過濾出特定的值,就跟 上面這個(gè)用戶名的例子一樣,但其作用難免有限。sed 編輯器在文本模式中采用了一種稱為 正則 表達(dá)式( regular expression )的特性來幫助你創(chuàng)建匹配效果更好的模式。
?2.3.3 命令組合使用
如果需要在單行上執(zhí)行多條命令,可以用花括號(hào)將多條命令組合在一起。 sed 編輯器會(huì)處理
地址行處列出的每條命令。
兩條命令都會(huì)作用到該地址上。同樣,也可以在一組命令前指定一個(gè)地址區(qū)間。?
2.4 刪除行?
文本替換命令不是 sed 編輯器唯一的命令。如果需要?jiǎng)h除文本流中的特定行,可以用刪除命令。
刪除命令d名副其實(shí),它會(huì)刪除匹配指定尋址模式的所有行。使用該命令時(shí)要特別小心,如 果你忘記加入尋址模式的話,流中的所有文本行都會(huì)被刪除。
2.4.1 指定地址刪除
?2.4.2 指定特定區(qū)間
?2.4.3?通過特殊的文件結(jié)尾字符
?筆記重點(diǎn):
記住,sed編輯器不會(huì)修改原始文件。你刪除的行只是從sed編輯器的輸出中消失了。原始
文件仍然包含那些“刪掉的”行。
2.5??插入和附加文本
和其他編輯器類似,sed編輯器允許向數(shù)據(jù)流插入和附加文本行。兩個(gè)操作的區(qū)別可能比較讓人費(fèi)解:
- 插入(insert)命令(i)會(huì)在指定行前增加一個(gè)新行;
- 附加(append)命令(a)會(huì)在指定行后增加一個(gè)新行。
這兩條命令的費(fèi)解之處在于它們的格式。它們不能在單個(gè)命令行上使用。你必須指定是要將行插入還是附加到另一行。格式如下:
sed '[address]command ?new line'
注意:new line 中的文本將會(huì)出現(xiàn)在 sed 編輯器輸出中你指定的位置。記住,當(dāng)使用插入命令時(shí), 文本會(huì)出現(xiàn)在數(shù)據(jù)流文本的前面。
?2.5.1 指定行數(shù)插入數(shù)據(jù)
2.6 修改行?
修改( change )命令允許修改數(shù)據(jù)流中整行文本的內(nèi)容。它跟插入和附加命令的工作機(jī)制
一樣,你必須在 sed 命令中單獨(dú)指定新行。
?2.7?轉(zhuǎn)換命令
轉(zhuǎn)換( transform )命令( y )是唯一可以處理單個(gè)字符的 sed 編輯器命令。轉(zhuǎn)換命令格式
如下:
[ address ] y / inchars / outchars /
轉(zhuǎn)換命令會(huì)對(duì) inchars 和 outchars 值進(jìn)行一對(duì)一的映射。 inchars 中的第一個(gè)字符會(huì)被轉(zhuǎn) 換outchars 中的第一個(gè)字符,第二個(gè)字符會(huì)被轉(zhuǎn)換成 outchars 中的第二個(gè)字符。這個(gè)映射過程會(huì)一直持續(xù)到處理完指定字符。如果inchars 和 outchars 的長(zhǎng)度不同,則 sed 編輯器會(huì)產(chǎn)生一 條錯(cuò)誤消息。
操作示例:
?如圖中輸出中看到的,inchars模式中指定字符的每個(gè)實(shí)例都會(huì)被替換成outchars模式中 相同位置的那個(gè)字符。 轉(zhuǎn)換命令是一個(gè)全局命令,也就是說,它會(huì)文本行中找到的所有指定字符自動(dòng)進(jìn)行轉(zhuǎn)換,而不會(huì)考慮它們出現(xiàn)的位置。
sed 編輯器轉(zhuǎn)換了在文本行中匹配到的字符 1 的兩個(gè)實(shí)例。無法限定只轉(zhuǎn)換在特定地方出現(xiàn) 的字符。
如下例:
2.8?使用 sed 處理文件
替換命令包含一些可以用于文件的標(biāo)記。還有一些 sed 編輯器命令也可以實(shí)現(xiàn)同樣的目標(biāo),
不需要非得替換文本。
2.8.1 寫入文件
w 命令用來向文件寫入行。該命令的格式如下:
[ address ]w filename
filename 可以使用相對(duì)路徑或絕對(duì)路徑,但不管是哪種,運(yùn)行 sed 編輯器的用戶都必須有文
件的寫權(quán)限。地址可以是 sed 中支持的任意類型的尋址方式,例如單個(gè)行號(hào)、文本模式、行區(qū)間
或文本模式。
下面的例子是將數(shù)據(jù)流中的前兩行打印到一個(gè)文本文件中:
?2.8.2?2. 從文件讀取數(shù)據(jù)
上面已經(jīng)了解了如何在 sed 命令行上向數(shù)據(jù)流中插入或附加文本。讀取( read )命令( r )允
許你將一個(gè)獨(dú)立文件中的數(shù)據(jù)插入到數(shù)據(jù)流中。
讀取命令的格式如下:
[ address ]r filename
filename 參數(shù)指定了數(shù)據(jù)文件的絕對(duì)路徑或相對(duì)路徑。你在讀取命令中使用地址區(qū)間,只
能指定單獨(dú)一個(gè)行號(hào)或文本模式地址。 sed 編輯器會(huì)將文件中的文本插入到指定地址后。
?后記:
雖然 shell 腳本本身完成很多事情,但單憑 shell 腳本通常很難處理數(shù)據(jù)。 Linux 提供了兩個(gè)方便
的工具來幫助處理文本數(shù)據(jù)。作為一款流編輯器, sed 編輯器能在讀取數(shù)據(jù)時(shí)快速地自動(dòng)處理數(shù) 據(jù)。必須給sed 編輯器提供用于處理數(shù)據(jù)的編輯命令。
下篇我們將會(huì)持續(xù)講到awk。。。。
?
本文摘自 :https://blog.51cto.com/u