最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

從入門到精通Shell正則表達式實戰(zhàn)

 更新時間:2026年03月04日 14:18:31   作者:J超會運  
正則表達式是Shell編程中處理文本的核心工具,配合 grep、sed、awk 等工具可實現(xiàn)強大的文本查找、替換、提取功能,本教程從基礎(chǔ)到進階,結(jié)合大量可直接運行的示例,幫你徹底掌握Shell正則表達式,感興趣的朋友跟隨小編一起看看吧

正則表達式(Regular Expression, Regex)是 Shell 編程中處理文本的核心工具,配合 grep、sed、awk 等工具可實現(xiàn)強大的文本查找、替換、提取功能。本教程從基礎(chǔ)到進階,結(jié)合大量可直接運行的示例,幫你徹底掌握 Shell 正則表達式。

一、正則表達式概述與 Shell 工具支持

1. 正則表達式的類型

Shell 中主要使用三種正則規(guī)范,不同工具支持的類型不同:

類型說明支持工具
基本正則(BRE)基礎(chǔ)元字符,部分元字符需轉(zhuǎn)義grep(默認)、sed(默認)
擴展正則(ERE)更多元字符,無需額外轉(zhuǎn)義grep -E、sed -E、awk
Perl 兼容正則(PCRE)功能最強,支持非貪婪匹配等高級特性grep -P

2. 核心工具速覽

  • grep:文本查找(Global Regular Expression Print)
  • sed:文本替換、編輯(Stream Editor)
  • awk:文本處理、數(shù)據(jù)分析(Aho-Weinberger-Kernighan)

二、基本正則表達式(BRE)

1. 基礎(chǔ)元字符

元字符功能說明示例示例解釋
^匹配行首grep '^root' /etc/passwd匹配以root開頭的行
$匹配行尾grep 'bash$' /etc/passwd匹配以bash結(jié)尾的行
.匹配任意單個字符(除換行)grep 'r..t' /etc/passwd匹配rt之間有 2 個任意字符的行(如rootrbtx
*匹配前一個字符 0 次或多次grep 'ro*t' /etc/passwd匹配rt、rot、root、rooot
[]匹配括號內(nèi)任意單個字符grep 'r[ao]t' file.txt匹配ratrot
[^]匹配不在括號內(nèi)的任意字符grep 'r[^ao]t' file.txt匹配rbt、rct等,但不匹配rat、rot
\轉(zhuǎn)義元字符,使其失去特殊含義grep 'www\.example\.com' file.txt匹配字面量www.example.com.被轉(zhuǎn)義)

2. 范圍匹配與重復(fù)(BRE 需轉(zhuǎn)義)

在 BRE 中,以下元字符必須加 \ 轉(zhuǎn)義才生效:

元字符(轉(zhuǎn)義后)功能說明示例
\{n\}匹配前一個字符恰好ngrep 'ro\{2\}t' /etc/passwd匹配rooto恰好 2 次)
\{n,\}匹配前一個字符至少ngrep 'ro\{2,\}t' file.txt匹配root、rooot
\{n,m\}匹配前一個字符nmgrep 'ro\{1,3\}t' file.txt匹配rot、root、rooot

三、擴展正則表達式(ERE)

使用 grep -E、sed -Eawk 時,元字符無需轉(zhuǎn)義,功能更強大。

1. 擴展元字符

元字符功能說明示例(用grep -E)
+匹配前一個字符 1 次或多次grep -E 'ro+t' file.txt匹配rot、root、rooot(不匹配rt
?匹配前一個字符 0 次或 1 次grep -E 'ro?t' file.txt匹配rtrot
``或邏輯,匹配左右任意一個`grep -E 'rootadmin' /etc/passwd`匹配包含rootadmin的行
()分組,將多個字符視為整體grep -E '(root)+' file.txt匹配root、rootroot
{n}匹配前一個字符恰好n次(無需轉(zhuǎn)義)grep -E 'ro{2}t' file.txt匹配root
{n,}匹配前一個字符至少ngrep -E 'ro{2,}t' file.txt匹配root、rooot
{n,m}匹配前一個字符nmgrep -E 'ro{1,3}t' file.txt匹配rot、root、rooot

四、POSIX 字符類

為了兼容不同字符集(如中文),Shell 提供了 POSIX 字符類,需用 [[]] 包裹:

字符類說明等價于(ASCII)
[:alnum:]字母和數(shù)字[a-zA-Z0-9]
[:alpha:]字母[a-zA-Z]
[:digit:]數(shù)字[0-9]
[:lower:]小寫字母[a-z]
[:upper:]大寫字母[A-Z]
[:space:]空白字符(空格、制表符等)[ \t\n\r\f\v]
[:punct:]標點符號[!\"#$%&'()*+,-./:;<=>?@[\\\]^_{}~]`

示例:匹配包含數(shù)字的行

grep '[[:digit:]]' file.txt

五、實際工具應(yīng)用(超詳細示例)

1.grep:文本查找

基礎(chǔ)用法

# 查找包含"error"的行(忽略大小寫)
grep -i 'error' log.txt
# 查找不包含"debug"的行
grep -v 'debug' log.txt
# 顯示匹配行的行號
grep -n 'root' /etc/passwd
# 遞歸查找當(dāng)前目錄下所有文件中的"TODO"
grep -r 'TODO' .

進階:結(jié)合擴展正則

# 查找以"202"開頭的年份(如2020、2021...2029)
grep -E '^202[0-9]' dates.txt
# 查找郵箱(簡化版)
grep -E '[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}' emails.txt

2.sed:文本替換與編輯

sed 默認使用 BRE,加 -E 啟用 ERE。

基礎(chǔ)替換

# 將文件中所有"apple"替換為"orange"(直接修改文件:加-i)
sed 's/apple/orange/g' file.txt > new_file.txt
sed -i 's/apple/orange/g' file.txt  # 直接修改原文件
# 只替換第2次出現(xiàn)的"apple"
sed 's/apple/orange/2' file.txt

進階:結(jié)合正則與分組

# 將"root:x:0:0:root:/root:/bin/bash"改為"User: root, Shell: /bin/bash"
# 分組\1匹配root,\2匹配/bin/bash
sed -E 's/^([a-z]+):.*:([^:]+)$/User: \1, Shell: \2/' /etc/passwd
# 刪除空行
sed '/^$/d' file.txt
# 刪除以#開頭的注釋行
sed '/^#/d' file.txt

3.awk:文本處理與數(shù)據(jù)分析

awk 默認使用 ERE,功能極其強大。

基礎(chǔ)用法

# 打印/etc/passwd的第1列(用戶名)和第7列(Shell)
awk -F: '{print $1, $7}' /etc/passwd
# 打印第3列(UID)大于1000的行
awk -F: '$3 > 1000' /etc/passwd

進階:結(jié)合正則

# 打印以"r"開頭的用戶名及其Shell
awk -F: '$1 ~ /^r/ {print $1, $7}' /etc/passwd
# 統(tǒng)計日志中"error"出現(xiàn)的次數(shù)
awk '/error/ {count++} END {print "Error count:", count}' log.txt
# 提取IP地址(簡化版)
awk '/([0-9]{1,3}\.){3}[0-9]{1,3}/ {print $0}' access.log

六、常見實用正則示例

1. 匹配手機號(中國大陸)

grep -E '^1[3-9][0-9]{9}$' phones.txt

2. 匹配 IP 地址(簡化版,不驗證合法性)

grep -E '([0-9]{1,3}\.){3}[0-9]{1,3}' ips.txt

3. 匹配日期(YYYY-MM-DD)

grep -E '^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$' dates.txt

4. 提取 HTML 中的鏈接(簡化版)

grep -Eo 'href="[^" rel="external nofollow" ]+"' index.html | sed -E 's/href="([^" rel="external nofollow" ]+)"/\1/'

七、注意事項與避坑指南

  • 轉(zhuǎn)義問題
    • BRE 中 +、?、|()、{} 需轉(zhuǎn)義,ERE 中無需轉(zhuǎn)義。
    • 在 Shell 腳本中使用正則時,注意單引號 ' 和雙引號 " 的區(qū)別:單引號內(nèi)的元字符不會被 Shell 解析,推薦使用單引號包裹正則。
  • 貪婪匹配 vs 非貪婪匹配
    • 默認是貪婪匹配(盡可能多匹配),如 a.*b 匹配 aabab 中的整個字符串。
    • 非貪婪匹配需用 PCRE(grep -P),如 a.*?b 匹配 aab。
  • 字符集問題
    • 處理中文時,確保終端和文件編碼一致(如 UTF-8),推薦使用 POSIX 字符類(如 [:alpha:] 匹配中文字母)。

到此這篇關(guān)于Shell正則表達式實戰(zhàn):從入門到精通的文章就介紹到這了,更多相關(guān)Shell正則表達式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論

蒙阴县| 习水县| 阳东县| 霞浦县| 曲阳县| 沙田区| 镇安县| 女性| 响水县| 思茅市| 禹州市| 卫辉市| 漳州市| 台中市| 启东市| 大关县| 儋州市| 黑龙江省| 平阳县| 福海县| 松潘县| 扎鲁特旗| 彰化县| 金沙县| 承德县| 新绛县| 大姚县| 二连浩特市| 日喀则市| 青浦区| 菏泽市| 阳信县| 广东省| 德钦县| 扶沟县| 建阳市| 南开区| 河北省| 额尔古纳市| 海安县| 响水县|