shell複習筆記 查詢與替換

2022-09-07 14:36:17 字數 4049 閱讀 4311

查詢文件

以grep 程式查詢文字(匹配文字 matching text)相當方便.傳統上有三種程式可以用來查詢整個文字檔案.

grep

語法: grep [ options ...] pattern -spec [ files ...]

用途: 現實匹配乙個或者多個模式的文字行.時常會作為管道(pipeline)的第一步,以便於對匹配的資料做進一步處理.

主要選項:

- e 使用擴充套件正規表示式進行匹配. grep -e可以取代傳統的 egrep.

- f 使用固定字串進行匹配. frep -f可取代傳統的 fgrep 命令

- e pat-list 通常,第乙個非選項的引數會指定要匹配的模式

- f pat -file 從 pat -file 檔案讀取模式作匹配.

-i 模式匹配時忽略大小寫差異.

-l 流出匹配模式的檔名稱,而不是列印匹配的行.

-q 靜默地.摸過模式匹配成功則 grep 會成功地離開,而不將匹配的行寫入標準輸出;否則即使不成功.

- s 不顯示錯誤資訊,通常與-q 並用.

-v 顯示不匹配模式的行

行為模式:

讀取命令列上知名的每個檔案.如果匹配查詢模式的行時,將它顯示出來.檔知名多個檔案時, grep 會在每一行前面加上檔名與乙個冒號.預設使用 bre.

警告: 你可以使用多個-d 與 -f 選項,建立要查詢的模式列表.

正規表示式

正規表示式是一種表示方式,讓你可以查詢匹配特定準則的文字.此表示法讓你可以寫乙個表示式,選定或匹配多個資料字串.從根本上看,正規表示式是由兩個基本組成部分所建立:一般字元與特殊字元.一般字元指的是任何沒有特殊意義的字元;某些情況下,特殊字元也可以視為一般字元,特殊字元常稱為元字元(metacharacter,簡稱 meta).

除了傳統的 unix 正規表示式之外, posix 正規表示式還可以做到:

posix 的正規表示式有兩種:基本正規表示式(bre)以及擴充套件正規表示式(ere).通常 ere 比 bre 功能更強大,不過不見得任何情況下都是這樣.正規表示式對程式執行時的 locale 環境相當敏感;方括號表示式裡的範圍應避免使用,改用字符集,例如[[: alnum:]]較佳.另外許多 gnu 程式都有額外的 meta 字元.

字元bre/ere

模式含義

\兩者都可

通常用以關閉後續字元的特殊意義.有時則是相反地開啟後續字元的特殊意義,例如\(...\)與\

.兩者都可

匹配任何單個的字元,但 nul 除外.獨立程式也可以不允許匹配換行字元.

*兩者都可

匹配在他之前的任何數目(或沒有)的單個字元.以 ere 而言,此前置字元可以使正規表示式,例如:因為.(點號)表示任一字元,所以.*代表"匹配任意字元的任一長度".以 bre 來說,*若至於正規表示式的第乙個字元,不具任何特殊意義.

^兩者都可

匹配緊接著的正規表示式,在行或字串的起始處. bre: 僅在正規表示式的開頭處具有此特殊含義; ere:至於任何位置都具特殊含義

$兩者都可

匹配前面的正規表示式,在字串或行結尾處. bre: 僅在正規表示式結尾處具特殊含義. ere:至於任何位置都具有特殊含義.

[...]

兩者都可

方括號表示式(bracket  expression),匹配方括號內的任意字元.連字元(-)指的是連續字元的範圍(注意:範圍會因 locale 而有所不同,因此不具可移植性).^符號置於方括號裡第乙個字元則有反向含義:指的是匹配不在列表內(方括號內)的任何字元.作為首字母的乙個連字元或是結束方括號(]),則被視為列表的一部分.所有其他的 meta 字元也列為列表的一部分(也就是:根據其字面上的意義).方括號表示式裡可能會含有排序符號

\bre

區間表示式(interval expression),匹配在它前面的單個字元重現(occurrences)的次數區間.

\( \)

bre將\( 與\)間的模式儲存在特殊的"保留空間(holding space)".最多可以將9個獨立的子模式(subpattern)儲存在單個模式中.匹配與子模式的文字,可通過轉義序列\1至\9,被重複使用在相同模式裡.例如:\( ab\).*1,指的是匹配與 ab 組合的兩次重現,中建科存在任何數目的字元.

\nbre

重複在\(與\)方括號內第 n 個子模式至此點的模式. n 為1至9的數字,1為由左開始.

ere與先前提及的 bre 的\一樣,只不過方括號前沒有反斜槓.

+ere

匹配前面正規表示式的零個或多個例項

?ere

匹配前面正規表示式的零個或乙個例項

|ere

匹配於|符號前或後的正規表示式

()ere

匹配於方括號括起來的正規表示式群.

擴充套件正規表示式

正規表示式的擴充套件

程式與正規表示式

在文字檔案裡進行替換

很多 shell 指令碼的工作都從通過 grep 或 egrep取出所需的文字開始.正規表示式最初結果,往往就成了要拿來做進一步處理的"原始資料(raw data)".通常文字替換(text substitution)至少需要做一件事,就是將一些字以另一些字代替,或者是刪除匹配航的某個部分.

一般來說,執行文字替換的正確程式應該是 sed---流編輯器(s

tream editor).sed 的設計就是用來以批處理的方式而不是用互動的方式將來編輯檔案. sed 存在的目的就在這裡.雖然你也可以使用 ed 或者 ex 編輯指令碼,但用他們處理會比較麻煩,通常使用者不會記得要儲存原來的檔案.

sed 是處理簡單字串替換的主要工具,大部分的 shell指令碼在使用 sed 時幾乎都是用來做替換的操作."從左邊開始,擴充套件至最長(longest leftmost)"這個法則描述了匹配的文字在何處匹配以及匹配擴充套件到多長.

sed

語法: sed [ -n ] '

edition command

'[file ...]

sed [ -n ] -e '

editing command

'... [ file ...]

sed [ -n ] -f script -file ... [file ...]

用途: 為了編輯它的輸入流,將結果生成到標準輸出,而非以互動式編輯器的方式拉編輯檔案.雖然 sed 命令很多,能做很複雜的工作,但它常用的還是處理資料流的文字替換,通常作為管道的一部分.

主要選項:

-e '

editing command

'將 editing command 使用在輸入資料上.當有多個命令需應用時,就必須使用-e 了.

-f script -file

自 script -file 中讀取編輯命令.當有多個命令需要執行時,該選項相當有用.

-n不是每個最後已修改結果都正常列印,而是現實以 p 指定(處理過的)行.

行為模式:

讀取每個輸入檔案的每一行,加入沒有檔案的話,則是標準輸入.以每一行來說, sed 會執行每乙個應用到輸入航的 editing command.結果會寫到標準輸出(預設狀態下,或是現實以 p 命令及-n 選項).若無-e 或- f 選項,則 sed 會把第乙個引數看作是要使用的 editing command.

find /home/tolstoy -type d -print   |  尋找所有目錄

sed 's;/home/tolstoy/;/home/lt/;' | 修改名稱:注意這裡使用分號作為定界符

sed 's/^/mkdir /' | 插入mkdir 命令

sh -x 以 shell 跟蹤模式執行

上述指令碼是講/ home/tolstoy 目錄結構建立乙份副本在/home/lt 下(可能是為備份而做的準備).

shell的查詢與替換

shell中做查詢,grep是注定逃不開的。cat file grep austin 就是在文件中查詢austin所在行。grep和正規表示式匹配之後,查詢功能變得異常強大。這個時候,要保證對正規表示式異常熟悉才好。這樣的話,處理起一些問題來會更加得心應手。另外不得不提的兩個編輯器 sed和awk....

shell指令碼之查詢與替換 一

文字查詢 searching 與文字替換 substitution 是編寫shell指令碼時經常用到的兩個基本操作。查詢文字 傳統上,有三種程式可以用來查詢整個文字檔案 grep,egrep extended grep fgrep fast grep grep最簡單的用法就是使用固定字串,例如who...

shell複習筆記 命令與引數

shell最基本的工作就是執行命令.每鍵入一道命令,shell 就會執行.cd work ls l whizprog.c 首先 格式很簡單,以空白 space 鍵或者 tab鍵 隔開命令列中的各個組成部分.其次,命令名稱是命令列的第乙個專案.通常後面會跟著選項 option 任何額外的引數 argu...