跳轉到內容

Ict-innovation/LPI/103.7

來自華夏公益教科書,開放的世界,開放的書籍

103.7 使用正則表示式

[編輯 | 編輯原始碼]

候選人應該能夠使用正則表示式操作檔案和文字資料。本目標包括建立包含多個符號元素的簡單正則表示式。它還包括使用正則表示式工具在檔案系統或檔案內容中執行搜尋。


關鍵知識領域

  • 建立包含多個符號元素的簡單正則表示式。
  • 使用正則表示式工具在檔案系統或檔案內容中執行搜尋。


使用grepfgrepegrep來查詢文字中的一個或多個單詞。搜尋期間使用的關鍵詞是稱為正則表示式的字母組合。許多其他應用程式(例如sedvi)也識別正則表示式。

正則表示式

傳統正則表示式(regex)

正則表示式是用於匹配模式的一系列字元(或原子)。字元可以是常量(按字面意義處理)或元字元。

表 1:主要元字元
字元
搜尋匹配
\<KEY 以‘KEY’開頭的單詞
WORD\> 以‘WORD’結尾的單詞
^ 一行的開頭
$ 一行的結尾
[ 範圍 ] 包含的 ASCII 字元範圍
[^c ] 不是字元‘c’
\[ 按字面意義解釋字元‘[’
“ca*t” 包含‘c’後跟零個或多個字母‘a’再後跟‘t’的字串
“.” 匹配任何單個字元


擴充套件正則表示式:

主要的 eregex 為:+、?、() 和 |

表 2:主要 eregex 列表
字元
搜尋匹配
"A1|A2|A3" 包含‘A1’或‘A2’或‘A3’的字串
"ca+t" 包含‘ca’後跟任意數量的字母‘a’再後跟‘t’的字串
"ca?t" 包含‘c’後跟零個或一個字母‘a’再後跟‘t’的字串

grep 家族

[編輯 | 編輯原始碼]

grep 實用程式支援正則表示式regex,例如表 1中列出的那些。

使用基本 grep

grep 的語法

grep PATTERN FILE

grep 的選項包括

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)。然後,每一行都解釋為要執行的新命令(不需要引號)。

COMMANDS 檔案示例
1 s/old/new/
/keyword/ s/old/new/g
23,25 d

使用COMMANDS檔案的語法是

sed -f COMMANDS MODIF

這比很長的命令列更緊湊!

sed 選項總結
命令列標誌
-e 執行以下命令
-f 從檔案讀取命令
-n 不列印未編輯的行
sed 命令
d 刪除整行
r 讀取檔案並追加到輸出
s 替換
w 將輸出寫入檔案



使用的檔案、術語和實用程式

  • grep
  • egrep
  • fgrep
  • sed
  • regex(7)


上一章 | 下一章

華夏公益教科書