網站首頁 編程語言 正文
之前我們學習了
linux grep
的基本操作,以及提及了linux grep
的孿生兄弟egrep 和 fgrep
,這次我們來看下。
在介紹正則表達式之前,我們先來嘗試一下,假如有如下文本。
我們想獲取空行,應該如何來寫呢?
命令:
grep ^$ test1 -n
通過上述例子,我們使用正則表達式^$
已經成功拿到了第四行數據,那么,這究竟如何解呢,我們細看博文。
正則表達式在grep應用以及差別
grep
表達式有三種不同的版本,分別為basic
(BRE
) 、extended
(ERE
) 以及 perl
(PCRE
) ,我們grep
默認支持的是BRE
,而ERE
是egrep
支持的,或者說是grep -E
支持的, 而PCRE
則是grep -P
支持的,那么這三者究竟有啥區別呢?
? | BRE | ERE | PCRE | ||
---|---|---|---|---|---|
任意字符 | . | . | . | ||
前一個字符0次或者出現1次 | ? | ? | ? | ||
前一個字符出現0次或無數次 | * | * | * | ||
前一個字符出現一個或者更多 | + | + | + | ||
字符集 | [...] | [...] | [...] | ||
字符集取反 | [^...] | [^...] | [^...] | ||
匹配前面字符出現的n次 | {n} | {n} | {n} | ||
匹配前面字符出現的n次以上 | {n,} | {n,} | {n,} | ||
匹配前面字符出現的n次到m次 | {n,m} | {n,m} | {n,m} | ||
開頭 | |||||
結尾 | $ | $ | $ | ||
多表達式連接 | | | ? | ? | ? | ? |
單詞 | \w | \w | \w 或者 [[:word:]] | ||
字母大寫/小寫 | [[:upper:]]/[[:lower:]] | [[:upper:]]/[[:lower:]] | [[:upper:]]/[[:lower:]] | ||
非單詞 | ? | ? | \W | ||
空白字符 | \s 或者 [[:space:]] | \s 或者 [[:space:]] | ? | ||
非空白字符 | [^[:space:]] | [^[:space:]] | \S | ||
數字 | \d 或者 [[:digit:]] | [[:digit:]] | [[:digit:]] | ||
非數字 | \D | [^[:digit:]] | [^[:digit:]] |
那么如何進行切換呢? 如上面所示,我們來看下。
如上所述,若我們需要連接多個匹配項,在BRE(grep)
中則是|
,而在ERE(egrep)
和PCRE(grep -P)
中則是|
,所以我們可以順利獲取出結果,更多匹配項如上所述
匹配案例
匹配電話號碼
若電話號碼為xxx-xxxx-xxxx
類型的,如何進行匹配呢? 我們可以使用'[0-9]{3}-[0-9]{4}-[0-9]{4}'
進行匹配。
例如:
命令:
echo "telphone: 180-1234-5678" | grep '[0-9]{3}-[0-9]{4}-[0-9]{4}' -o
同樣的,該方法還可以用來匹配其ip
地址,正則: [0-9]{0,3}.[0-9]{0,3}.[0-9]{0,3}.[0-9]{0,3}
匹配空行
若我們想匹配空行,則可以使用^$
進行匹配,即: 開頭就是結尾。
例如:
如上命令,我們順利取出了 第3、5、6行數據
匹配所有字母
命令:
echo 'Ac123e23dddwQW21' | grep "[[:upper:]]|[[:lower:]]" -o
取出redis
在使用的配置文件
我們知道redis
服務器是以#
來注釋的,我們可以利用grep
或者egrep
來過濾掉注釋和空格,例如:
fgrep
fgrep
最為簡單,它不會啟用正則表達式,而是按照字符來進行搜索,什么意思呢? 我們舉個小案例就清楚了,
它不會進行任何正則匹配,所以可以直接使用搜索選就成,不用考慮轉移啥的。
總結
我們一般將BRE
稱之為 基本正則表達式、ERE
稱之為 擴展正則表達式 而 PCRE
稱之為Perl
兼容的正則表達式,如上正則表達式不是grep
工具所實現的,而是單獨的一套表達式,有很多語言在使用中,例如 sed
默認正則表達式是 BRE
, 而我們之前所學習的awk
使用的正則表達式則是ERE
,是不是感覺知識被串聯起來了呢,好巧,我也是,怎么樣,快來動手試驗一下吧。
原文鏈接:https://juejin.cn/post/7129495277093797918
相關推薦
- 2022-06-14 ASP.NET?Core?MVC控制器請求依賴注入_實用技巧
- 2023-10-28 C語言中getchar函數詳解看這一篇就夠了(函數功能、使用、返回值)_C 語言
- 2022-11-05 android繪制曲線和折線圖的方法_Android
- 2022-08-27 C#過濾sql特殊字符串的方法_C#教程
- 2022-12-27 golang時間/時間戳的獲取與轉換實例代碼_Golang
- 2022-01-20 空值判斷運算符 ? ?
- 2022-10-06 Redis中鍵和數據庫通用指令詳解_Redis
- 2022-07-09 C++深入探究用NULL來初始化空指針是否合適_C 語言
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支