在 Shell 正則表達式(如 grep、sed、awk)中,點號 . 是最基礎且最常用的元字符,代表「匹配除換行符外的任意單個字符」。本文透過可視化示例徹底講透其用法。
. 匹配任意單個字符:字母、數字、標點、空格、中文、控制字符(除 \n)\.[] 字符類中,. 失去特殊含義,僅代表字面點號假設文件 text.txt 內容:
ab5er
abcer
ad(er
ab(er
cd(er
ab$er
aber
ab er
ab
er
ab.er 匹配過程解析| 行內容 | 是否匹配 | 匹配子串 | 說明 |
|---|---|---|---|
| ab5er | ✅ | ab5er | . 匹配 5 |
| abcer | ✅ | abcer | . 匹配 c |
| ad(er | ❌ | - | 第 3 字符為 d,非 b |
| ab(er | ✅ | ab(er | . 匹配 ( |
| cd(er | ❌ | - | 不以 ab 開頭 |
| ab$er | ✅ | ab$er | . 匹配 $ |
| aber | ❌ | - | 長度不足 5 字符 |
| ab er | ✅ | ab er | . 匹配空格 |
| ab | ❌ | - | 長度不足 |
| er | ❌ | - | 不以 ab 開頭 |
# 基礎用法
grep 'ab.er' text.txt # 輸出匹配行
sed -n '/ab.er/p' text.txt # 同 grep
awk '/ab.er/' text.txt # 同 grep
# 進階:結合量詞
grep 'ab..er' text.txt # 匹配 ab + 任意2字符 + er
grep 'ab.*er' text.txt # 匹配 ab + 任意多字符(含0) + er (貪婪)
grep 'ab.\{3\}er' text.txt # 匹配 ab + 任意3字符 + er (\{m\} 指定次數)
# 轉義字面點號
grep '192\.168\.1\.1' ip.txt # 精確匹配 IP 地址
. 匹配換行符:默認不匹配,需 grep -z 或 sed -z (GNU) 處理多行ls ab?.txt 中 ? 等價於正則 .,但 * 行為不同. 按字節匹配可能導致半字符匹配,建議使用 grep -P (PCRE) 支援 Unicode 屬性| 工具 | 正則引擎 | . 行為 | 匹配換行 |
|---|---|---|---|
| grep | BRE/ERE (-E) | 不匹配 \n | -z 選項 |
| sed | BRE | 不匹配 \n | -z 選項 |
| awk | ERE | 不匹配 \n | RS 變量控制 |
| grep -P | PCRE | 不匹配 \n | (?s) 模式修飾符 |
| perl | PCRE | 不匹配 \n | /s 修飾符 |
掌握 . 的精確語義,是編寫高效文本處理腳本的基石。