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