Bash?Shell通配符與正則表達式實用示例詳解
一、通配符 (Wildcards)
通配符是Shell用于文件名擴展的特殊字符,主要用于匹配文件和目錄名。
基礎通配符
| 通配符 | 名稱 | 功能描述 | 示例 |
|---|---|---|---|
* | 星號 | 匹配任意數量任意字符 | ls *.txt |
? | 問號 | 匹配單個任意字符 | ls file?.txt |
[] | 字符集 | 匹配括號內任意一個字符 | ls [abc]*.txt |
[!] | 否定字符集 | 匹配不在括號內的任意一個字符 | ls [!a]*.txt |
{} | 花括號擴展 | 生成多個可能組合 | touch file{1,2,3}.txt |
高級通配符 (extglob)
啟用擴展通配符:
shopt -s extglob
| 模式 | 功能描述 | 示例 |
|---|---|---|
?(pattern) | 匹配0次或1次給定模式 | ls ?(.txt) |
*(pattern) | 匹配0次或多次給定模式 | ls *(backup) |
+(pattern) | 匹配1次或多次給定模式 | ls +(log) |
@(pattern) | 匹配給定模式之一 | `ls @(jpg |
!(pattern) | 匹配除給定模式外的任何內容 | ls !(*.bak) |
二、正則表達式 (Regular Expressions)
正則表達式用于文本匹配和處理,比通配符更強大靈活。
基礎正則表達式 (BRE)
| 元字符 | 功能描述 | 示例 |
|---|---|---|
. | 匹配任意單個字符 | grep 'f.le' file.txt |
* | 匹配前一個字符0次或多次 | grep 'go*d' file.txt |
^ | 匹配行首 | grep '^start' file.txt |
$ | 匹配行尾 | grep 'end$' file.txt |
[] | 匹配字符集中的任意一個字符 | grep '[aeiou]' file.txt |
[^] | 匹配不在字符集中的任意字符 | grep '[^0-9]' file.txt |
\ | 轉義特殊字符 | grep '\.' file.txt |
擴展正則表達式 (ERE)
啟用擴展正則表達式:
grep -E 或 egrep
| 元字符 | 功能描述 | 示例 |
|---|---|---|
+ | 匹配前一個字符1次或多次 | grep -E 'go+d' file.txt |
? | 匹配前一個字符0次或1次 | grep -E 'colou?r' file.txt |
| ` | ` | 或操作,匹配多個模式之一 |
() | 分組 | grep -E '(abc)+' file.txt |
{} | 指定匹配次數 | grep -E 'a{3}' file.txt |
POSIX字符類
| 字符類 | 等價于 | 描述 |
|---|---|---|
[:alnum:] | [a-zA-Z0-9] | 字母和數字 |
[:alpha:] | [a-zA-Z] | 字母 |
[:digit:] | [0-9] | 數字 |
[:lower:] | [a-z] | 小寫字母 |
[:upper:] | [A-Z] | 大寫字母 |
[:space:] | [ \t\r\n\v\f] | 空白字符 |
[:punct:] | [!-/:-@[-{-~]` | 標點符號 |
三、通配符與正則表達式對比
| 特性 | 通配符 | 正則表達式 |
|---|---|---|
| 主要用途 | 文件名匹配 | 文本匹配 |
| 使用場景 | Shell命令參數 | grep/sed/awk等文本處理工具 |
* 的含義 | 任意字符序列 | 前一個字符的0次或多次重復 |
? 的含義 | 任意單個字符 | 前一個字符的0次或1次重復 |
[] 的作用 | 匹配字符集 | 匹配字符集 |
^ 的作用 | 無特殊含義 | 行首定位 |
$ 的作用 | 無特殊含義 | 行尾定位 |
| ` | ` 的作用 | 無特殊含義 |
() 的作用 | 無特殊含義 | 分組 |
四、實用示例
1. 文件操作
# 刪除所有備份文件 rm *~ # 移動所有圖片文件 mv *.@(jpg|png|gif) images/ # 查找所有2023年的日志文件 ls *2023*.log
2. 文本處理
# 查找包含"error"或"warning"的行
grep -E 'error|warning' log.txt
# 提取所有郵箱地址
grep -E '\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b' file.txt
# 替換日期格式 (YYYY-MM-DD → DD/MM/YYYY)
sed -E 's/([0-9]{4})-([0-9]{2})-([0-9]{2})/\3\/\2\/\1/' dates.txt
3. 高級模式匹配
# 匹配有效的IP地址
grep -E '^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$' ips.txt
# 匹配有效的URL
grep -E '^(https?|ftp)://[^[:space:]]+' urls.txt
# 匹配信用卡號 (16位數字,4位一組)
grep -E '^([0-9]{4}-){3}[0-9]{4}$' cards.txt
五、性能優(yōu)化技巧
避免過度使用通配符
# 不推薦 rm * # 推薦 (更安全) rm -i *
使用更精確的匹配
# 不推薦 ls *log* # 推薦 ls *.log
正則表達式預編譯
# 對于重復使用的正則表達式 pattern='^[A-Z][a-z]+$' grep "$pattern" names.txt
使用LC_ALL=C提高性能
# 對于ASCII文本處理 LC_ALL=C grep 'pattern' largefile.txt
六、常見問題解決
問題1:通配符不匹配
解決方案:
# 檢查是否啟用了通配符 echo ~/* # 應該顯示家目錄內容 # 檢查特殊字符轉義 ls file\*.txt
問題2:正則表達式匹配失敗
解決方案:
# 使用grep -P (PCRE) 支持更復雜的正則
grep -P '\d{3}-\d{2}-\d{4}' ssn.txt
# 使用在線正則測試工具驗證
問題3:文件名包含特殊字符
解決方案:
# 使用雙引號
rm "file with spaces.txt"
# 使用find命令
find . -name "*.txt" -exec rm {} \;
七、學習資源
交互式學習工具:
- https://regex101.com/ - 在線正則表達式測試和調試
- https://regexr.com/ - 實時正則表達式學習工具
參考文檔:
man 7 glob- Linux通配符文檔man 7 regex- Linux正則表達式文檔man grep- grep命令手冊
進階書籍:
- 《精通正則表達式》- Jeffrey E.F. Friedl
- 《Linux命令行與Shell腳本編程大全》- Richard Blum
通過掌握通配符和正則表達式,您可以大幅提高在Linux命令行環(huán)境中的工作效率和文本處理能力。建議從基礎開始練習,逐步掌握更復雜的模式匹配技巧。
到此這篇關于Bash Shell通配符與正則表達式的文章就介紹到這了,更多相關Bash Shell通配符與正則表達式內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
一天一個shell命令 linux文本操作系列-tac,rev命令詳解
這篇文章主要介紹了一天一個shell命令 linux文本操作系列-tac,rev命令詳解,需要的朋友可以參考下2016-06-06
Linux監(jiān)控cpu以及內存使用情況之top命令(詳解)
下面小編就為大家?guī)硪黄狶inux監(jiān)控cpu以及內存使用情況之top命令(詳解)。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-05-05

