查找文檔
以grep 程序查找文本(匹配文本 matching text)相當方便.傳統上有三種程序可以用來查找整個文本文件.
$ who |grep -F austen //范例中使用- F 選項,以查找固定字符串 austen.
事實上,只要匹配的模式里未含有正則表達式的 meta 字符(metacharacter),則 grep 默認行為模式就等同于使用了-F.
$ who |grep austen
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 字符也列為列表的一部分(也就是:根據其字面上的意義).方括號表達式里可能會含有排序符號 |
/{n/m} | BRE | 區間表達式(interval expression),匹配在它前面的單個字符重現(occurrences)的次數區間. |
/( /) | BRE | 將/( 與/)間的模式存儲在特殊的"保留空間(holding space)".最多可以將9個獨立的子模式(subpattern)存儲在單個模式中.匹配與子模式的文本,可通過轉義序列/1至/9,被重復使用在相同模式里.例如:/( ab/).*1,指的是匹配與 ab 組合的兩次重現,中建科存在任何數目的字符. |
/n | BRE | 重復在/(與/)方括號內第 n 個子模式至此點的模式. n 為1至9的數字,1為由左開始. |
{n,m} | ERE | 與先前提及的 BRE 的/{n/m}一樣,只不過方括號前沒有反斜杠. |
+ | ERE | 匹配前面正則表達式的零個或多個實例 |
? | ERE | 匹配前面正則表達式的零個或一個實例 |
| | ERE | 匹配于|符號前或后的正則表達式 |
() | ERE | 匹配于方括號括起來的正則表達式群. |
擴展正則表達式
正則表達式的擴展
程序與正則表達式
在文本文件里進行替換
很多 shell 腳本的工作都從通過 grep 或 egrep取出所需的文本開始.正則表達式最初結果,往往就成了要拿來做進一步處理的"原始數據(raw data)".通常文本替換(text substitution)至少需要做一件事,就是將一些字以另一些字代替,或者是刪除匹配航的某個部分.
一般來說,執行文本替換的正確程序應該是 sed---流編輯器(Stream 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 下(可能是為備份而做的準備).
新聞熱點
疑難解答