Ict-innovation/LPI/103.7
候選人應該能夠使用正則表示式操作檔案和文字資料。本目標包括建立包含多個符號元素的簡單正則表示式。它還包括使用正則表示式工具在檔案系統或檔案內容中執行搜尋。
關鍵知識領域
- 建立包含多個符號元素的簡單正則表示式。
- 使用正則表示式工具在檔案系統或檔案內容中執行搜尋。
使用grep、fgrep或egrep來查詢文字中的一個或多個單詞。搜尋期間使用的關鍵詞是稱為正則表示式的字母組合。許多其他應用程式(例如sed和vi)也識別正則表示式。
正則表示式
傳統正則表示式(regex)
正則表示式是用於匹配模式的一系列字元(或原子)。字元可以是常量(按字面意義處理)或元字元。
| \<KEY | 以‘KEY’開頭的單詞 |
| WORD\> | 以‘WORD’結尾的單詞 |
| ^ | 一行的開頭 |
| $ | 一行的結尾 |
| [ 範圍 ] | 包含的 ASCII 字元範圍 |
| [^c ] | 不是字元‘c’ |
| \[ | 按字面意義解釋字元‘[’ |
| “ca*t” | 包含‘c’後跟零個或多個字母‘a’再後跟‘t’的字串 |
| “.” | 匹配任何單個字元 |
擴充套件正則表示式:
主要的 eregex 為:+、?、() 和 |
| "A1|A2|A3" | 包含‘A1’或‘A2’或‘A3’的字串 |
| "ca+t" | 包含‘ca’後跟任意數量的字母‘a’再後跟‘t’的字串 |
| "ca?t" | 包含‘c’後跟零個或一個字母‘a’再後跟‘t’的字串 |
grep 實用程式支援正則表示式regex,例如表 1中列出的那些。
使用基本 grep
grep 的語法
grep PATTERN FILE
grep 的選項包括
| -c | 計算與 PATTERN 匹配的行數 |
| -f | 從檔案獲取 PATTERN |
| -i | 忽略大小寫敏感 |
| -n | 包含匹配行的行號 |
| -v | 輸出所有不包含 PATTERN 的行 |
| -w | 僅當模式匹配整個單詞時選擇行。 |
例如,列出 /etc/lilo.conf 中所有非空行
| $ grep –v “^$” /etc/lilo.conf |
egrep
egrep 工具支援擴充套件正則表示式eregex,例如表 2中列出的那些。
egrep 實用程式將處理任何現代正則表示式。如果在命令列輸入多個關鍵詞,並用豎線字元分隔,它也可以搜尋它們。
例如
| $ egrep 'linux|^image' /etc/lilo.conf |
fgrep
fgrep 代表快速 grep,fgrep 按字面意思解釋字串(不支援 regex 或 eregex)。fgrep 實用程式不識別正則表示式的特殊含義。
例如
| $ fgrep 'cat*' FILE |
將只匹配包含‘cat*’的單詞。主要改進來自fgrep從檔案中逐行輸入的關鍵詞列表(例如 LIST)中搜索的能力。語法將是
| $ fgrep –f LIST FILE |
流編輯器 - sed
sed 對檔案執行自動的、非互動式的編輯。它通常用於指令碼中以搜尋和替換文字中的模式。它支援大多數正則表示式。
sed 的語法
sed [options] 'command' [INPUTFILE]
輸入檔案是可選的,因為sed也適用於檔案重定向和管道。以下是一些示例,假設我們正在操作一個名為 MODIF 的檔案。
刪除所有註釋行
| $ sed '/^#/ d ' MODIF |
請注意,搜尋模式位於兩個斜槓之間。
將 /dev/hda1 替換為 /dev/sdb3
| $ sed 's/\/dev\/hda1/\/dev\/sdb3/g' MODIF |
命令中的s代表“替換”。g代表“全域性”,並強制替換在每一行中都發生。您也可以指定替換應該發生的哪一行,可以使用行號或正則表示式匹配。
如果行包含關鍵詞 KEY,則將‘:’替換為‘;’(全域性)
| $ sed '/KEY/ s/:/;/g' MODIF |
更高階的 sed
您可以發出多個命令,每個命令都以–e開頭,在命令列輸入。例如,(1)刪除所有空行,然後(2)將MODIF檔案中的‘OLD’替換為‘NEW’
| $ sed –e '/^$/ d’ -e ‘s/OLD/NEW/g' MODIF |
這些命令也可以寫入檔案(例如 COMMANDS)。然後,每一行都解釋為要執行的新命令(不需要引號)。
| 1 s/old/new/ |
| /keyword/ s/old/new/g |
| 23,25 d |
使用COMMANDS檔案的語法是
sed -f COMMANDS MODIF
這比很長的命令列更緊湊!
| -e 執行以下命令 |
| -f 從檔案讀取命令 |
| -n 不列印未編輯的行 |
| d 刪除整行 |
| r 讀取檔案並追加到輸出 |
| s 替換 |
| w 將輸出寫入檔案 |
使用的檔案、術語和實用程式
- grep
- egrep
- fgrep
- sed
- regex(7)