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

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

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

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

一、正則表達(dá)式概述與 Shell 工具支持

1. 正則表達(dá)式的類型

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

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

2. 核心工具速覽

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

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

1. 基礎(chǔ)元字符

元字符功能說明示例示例解釋
^匹配行首grep '^root' /etc/passwd匹配以root開頭的行
$匹配行尾grep 'bash$' /etc/passwd匹配以bash結(jié)尾的行
.匹配任意單個(gè)字符(除換行)grep 'r..t' /etc/passwd匹配rt之間有 2 個(gè)任意字符的行(如rootrbtx
*匹配前一個(gè)字符 0 次或多次grep 'ro*t' /etc/passwd匹配rt、rot、root、rooot
[]匹配括號(hào)內(nèi)任意單個(gè)字符grep 'r[ao]t' file.txt匹配ratrot
[^]匹配不在括號(hào)內(nèi)的任意字符grep 'r[^ao]t' file.txt匹配rbtrct等,但不匹配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\}匹配前一個(gè)字符恰好ngrep 'ro\{2\}t' /etc/passwd匹配rooto恰好 2 次)
\{n,\}匹配前一個(gè)字符至少ngrep 'ro\{2,\}t' file.txt匹配root、rooot
\{n,m\}匹配前一個(gè)字符nmgrep 'ro\{1,3\}t' file.txt匹配rotroot、rooot

三、擴(kuò)展正則表達(dá)式(ERE)

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

1. 擴(kuò)展元字符

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

四、POSIX 字符類

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

字符類說明等價(jià)于(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:]標(biāo)點(diǎn)符號(hào)[!\"#$%&'()*+,-./:;<=>?@[\\\]^_{}~]`

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

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

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

1.grep:文本查找

基礎(chǔ)用法

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

進(jìn)階:結(jié)合擴(kuò)展正則

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

2.sed:文本替換與編輯

sed 默認(rèn)使用 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

進(jìn)階:結(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 默認(rèn)使用 ERE,功能極其強(qiáng)大。

基礎(chǔ)用法

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

進(jìn)階:結(jié)合正則

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

六、常見實(shí)用正則示例

1. 匹配手機(jī)號(hào)(中國(guó)大陸)

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

2. 匹配 IP 地址(簡(jiǎn)化版,不驗(yàn)證合法性)

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 中的鏈接(簡(jiǎn)化版)

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

七、注意事項(xiàng)與避坑指南

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

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

相關(guān)文章

最新評(píng)論

朔州市| 丘北县| 泾川县| 咸宁市| 体育| 扬中市| 北票市| 青田县| 乐清市| 桓台县| 隆昌县| 垫江县| 新蔡县| 沁阳市| 竹山县| 长丰县| 卓资县| 库车县| 郁南县| 缙云县| 延庆县| 龙川县| 洛阳市| 苏尼特右旗| 丹棱县| 余干县| 镇宁| 建阳市| 尤溪县| 桐城市| 陈巴尔虎旗| 荆门市| 翁牛特旗| 兰州市| 民权县| 太白县| 竹溪县| 师宗县| 博湖县| 拜泉县| 南平市|