
前言:
shell腳本最常見的一個用途就是處理文本檔案,檢查日志檔案、讀取配置 檔案、處理資料元素,shell腳本可以幫助我們將文本檔案中各種資料的日常處理任務自動化,但僅靠shell腳本命令來處理文本檔案的內容有點力不從心的,如果想在shell腳本中處理任何型別的資料,掌握sed和gawk工具可以達到事半功倍的效果,企業開發中常用,高階命令,
一、sed編輯器基本了解
sed 編輯器被稱作 流編輯器 ( stream editor),和普通的互動式文本編輯器恰好相反,流編輯器會在編輯器處理資料之前基于預先提供的一組規則來編輯資料流, 可以根據命令來處理資料流中的資料,這些命令要么從命令列中輸入,要么存盤 在一個命令文本檔案中,
- 一次從輸入中讀取一行資料,
- 根據所提供的編輯器命令匹配資料,
- 按照命令修改流中的資料,
- 將新的資料輸出到STDOUT,
核心講解:
在流編輯器將所有命令與一行資料匹配完畢后,它會讀取下一行資料并重復這個程序,在流編輯器處理完流中的所有資料行后,它就會終止,由于命令是按順序逐行給出的, sed 編輯器只需對資料流進行一遍處理就可以完成編輯操作,這使得 sed 編輯器要比互動式編輯器快得多,你可以快速完成對資料的自動修改,
有了上面核心理論的了解,下面我們就可以對sed進行實操演練了:
sed 使用的語法格式:
sed options script file
常用引數羅列:
- -e script 在處理輸入時,將script中指定的命令添加到已有的命令中
- -f file 在處理輸入時,將file中指定的命令添加到已有的命令中
- -n 不產生命令輸出,使用print命令來完成輸出
重點說明:
script 引數指定了應用于流資料上的單個命令,如果需要用多個命令,要么使用 -e 選項在命令列中指定,要么使用 -f 選項在單獨的檔案中指定,有大量的命令可用來處理資料,
1.1 在終端命令列使用單條sed命令
默認情況下, sed 編輯器會將指定的命令應用到 STDIN 輸入流上,這樣你可以直接將資料通過管道輸入 sed 編輯器處理,
如截圖中所見,這個例子在sed編輯器中使用了s命令,s命令會用斜線間指定的第二個文本字串來替換第 一個文本字串模式,在本例中是big test替換了test,
整個文本修改:

核心講解:
在運行上面的例子時,結果都是立即就會顯示出來的,這就是使用 sed編輯器的強大之處,我們可以同時對文本資料做出多處修改,而需要操作的時間是及其短暫的,需要注意的一點的是,sed編輯器并不會修改原來文本檔案的資料,它只會將修改后的資料發送到STDOUT,我們可以查看源文本的資料依舊保持不變,
1.2 在命令列使用多個sed 命令
要在 sed 命令列上執行多個命令時,只要用 -e 選項就可以了,
操作演示:

操作詳解:
兩個命令都作用到檔案中的每行資料上,命令之間必須用分號隔開,并且在命令末尾和分號 之間不能有空格,還有一種方式我們使用的很少,就是用shell中的次提示符來分隔命令,如下截圖:

1.3 從檔案中讀取編輯器命令
有時候我們有大量要處理的sed命令,此時我們就可以命令放在一個腳本檔案里,檔案通常以.sed 結尾,使用中我們只需要應用 -f 引數,就可以來讀取檔案中命令:

核心解說:
如上圖,sed編輯器知道每行都是一條單獨的命令, 跟在命令列輸入命令一樣,sed編輯器會從指定檔案中讀取命令,并將它們應用到資料檔案中的 每一行上,同樣達到了對文本處理的效果,
二、sed編輯器作業中經常的使用
成功使用 sed 編輯器的關鍵在于掌握其各式各樣的命令和格式,它們能夠幫助你定制文本編輯行為,本節將介紹一些可以集成到腳本中基本命令和功能,上面章節我們已經懂得了如何用s 命令( substitute )來在行中替換文本,這個命令還有另外一些選 項能讓事情變得更為簡單,
2.1. 替換標記
上圖中可以看到替換命令在替換多行中的文本時能正常作業,但默認情況下它只替換每行中出現的第一處, 要讓替換命令能夠替換一行中不同地方出現的文本必須使用替換標(substitutionflag),替換標記會在替換命令字串之后設定,
替換標記分類:
- 數字,表明新文本將替換第幾處模式匹配的地方;
- g,表明新文本將會替換所有匹配的文本;
- p,表明原先行的內容要列印出來;
- w file,將替換的結果寫到檔案中,

對比一以上兩圖,我們可以得出結論:
將替換標記指定為 2 的結果就是: sed 編輯器只替換每行中第二次出現的匹配模式, g替換標記使你能替換文本中匹配模式所匹配的每處地方,

2.2 替換字符
有時我們會在文本字串中遇到一些不太方便在替換模式中使用的字符, Linux 中一個常見的例子就是正斜線( / ), 替換檔案中的路徑名會比較麻煩,
上面我們可以發現,由于正斜線通常用作字串分隔符,因而如果它出現在了模式文本中的話,必須用反斜線來 轉義,這通常會帶來一些困惑和錯誤, 要解決這個問題,sed編輯器允許選擇其他字符來作為替換命令中的字串分隔符,下例中我們就是使用感嘆號用作字串分隔符,

2.3 sed 的尋址操作
sed 的尋址模式分為兩種:
- 以數字形式表示行區間
- 用文本模式來過濾出行
兩種尋址的語法格式是相同的,sed編輯器會將指定的每條命令作用到匹配指定地址的行上,
[address]command或者是將特定地址的多個命令分組:address {command1command2command3}
2.3.1 數字尋址(常用的方式)
當使用數字方式的行尋址時,可以用行在文本流中的行位置來參考,sed 編輯器會將文本流中的第一行編號為1 ,然后繼續按順序為接下來的行分配行號, 在命令中指定的地址可以是單個號,或是用起始行號、逗號以及結尾行號指定的一定區間范圍內的行,
b.行地址區間
c.如果想將命令作用到文本中從某行開始的所有行,可以用特殊地址$.

2.3.2 使用文本模式過濾器(不常用)
/pattern/ command
必須用正斜線將要指定的pattern封起來,sed編輯器會將該命令作用到包含指定文本模式的行上,
如下面給的示例:修改用戶Samantha的默認shell,可以使用sed命令,
核心詳解:
該命令只作用到匹配文本模式的行上,雖然使用固定文本模式能幫你過濾出特定的值,就跟 上面這個用戶名的例子一樣,但其作用難免有限,sed 編輯器在文本模式中采用了一種稱為 正則 運算式( regular expression )的特性來幫助你創建匹配效果更好的模式,
2.3.3 命令組合使用
如果需要在單行上執行多條命令,可以用花括號將多條命令組合在一起, sed 編輯器會處理地址行處列出的每條命令,
兩條命令都會作用到該地址上,同樣,也可以在一組命令前指定一個地址區間,

2.4 洗掉行
文本替換命令不是 sed 編輯器唯一的命令,如果需要洗掉文本流中的特定行,可以用洗掉命令,洗掉命令d名副其實,它會洗掉匹配指定尋址模式的所有行,使用該命令時要特別小心,如 果你忘記加入尋址模式的話,流中的所有文本行都會被洗掉,

2.4.1 指定地址洗掉
2.4.2 指定特定區間

2.4.3 通過特殊的檔案結尾字符

筆記重點:
記住,sed編輯器不會修改原始檔案,你洗掉的行只是從sed編輯器的輸出中消失了,原始檔案仍然包含那些“刪掉的”行,
2.5 插入和附加文本
和其他編輯器類似,sed編輯器允許向資料流插入和附加文本行,兩個操作的區別可能比較讓人費解:
- 插入(insert)命令(i)會在指定行前增加一個新行;
- 附加(append)命令(a)會在指定行后增加一個新行,
這兩條命令的費解之處在于它們的格式,它們不能在單個命令列上使用,你必須指定是要將行插入還是附加到另一行,格式如下:
sed '[address]command new line'

2.5.1 指定行數插入資料


2.6 修改行
修改( change )命令允許修改資料流中整行文本的內容,它跟插入和附加命令的作業機制一樣,你必須在 sed 命令中單獨指定新行,
2.7 轉換命令
[ address ] y / inchars / outchars /

如圖中輸出中看到的,inchars模式中指定字符的每個實體都會被替換成outchars模式中 相同位置的那個字符, 轉換命令是一個全域命令,也就是說,它會文本行中找到的所有指定字符自動進行轉換,而不會考慮它們出現的位置,
2.8 使用 sed 處理檔案
替換命令包含一些可以用于檔案的標記,還有一些 sed 編輯器命令也可以實作同樣的目標,不需要非得替換文本,
2.8.1 寫入檔案
[ address ]w filename
2.8.2 2. 從檔案讀取資料
[ address ]r filename

后記:
雖然 shell 腳本本身完成很多事情,但單憑 shell 腳本通常很難處理資料, Linux 提供了兩個方便的工具來幫助處理文本資料,作為一款流編輯器, sed 編輯器能在讀取資料時快速地自動處理數 據,必須給sed 編輯器提供用于處理資料的編輯命令,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/303048.html
標籤:其他
上一篇:資料結構學習筆記--順序表
