linux正則表達式,反斜線加普通字符作為正則表達式詳解
前言
提示:使用linux shell是tcsh。
正則表達式是在為用戶欲將處理的文本內(nèi)容設(shè)置了樣式,然后Linux程序、命令等會根據(jù)樣式來匹配文字。不再贅述該概念。
一、反斜線 \ 加普通字符作為正則表達式
首先,反斜線\是普通正則表達式,自然也就不需要使用擴展項去告知Linux程序、命令等將要匹配的樣式指定為擴展正則表達式,省去了很多不必要的麻煩,執(zhí)行速度也會更快,有些Linux命令為了執(zhí)行速度更快,將樣式默認為普通正則表達式。
下列出了反斜線加上普通字符用作正則表達式的情況。
| 定義模式 | 所包括的字符 | 注釋 |
|---|---|---|
| \d | [0-9] | 單個數(shù)字,來自digit |
| \D | [a-zA-Z] | 單個非數(shù)字字符 |
| \w | [a-zA-Z0-9_] | 單個字母數(shù)字下劃線,來自word |
| \W | 單個非數(shù)字字母下劃線的字符 | 匹配符號,如逗號,、空格、短線- 等 |
| \s | [:space:]、\n、\t | 單個空格、換行符、或制表符,來自space |
| \S | 除空格、換行符、制表符的任意字符 | 如[0-9a-zA-Z_]、下劃線_、短線- 等 |
| \b | 單詞邊界 | |
| \B | 非單詞邊界 | |
| \t | 制表符 | 一個大距離的間隔,和4個連續(xù)的空格類似 |
| \n | 換行符 | 光標調(diào)到下一行位置 |
| \r | 回車 | 光標回到起始位置 |
| \v | 垂直制表符 | |
| \f | 換頁符 |
注意:
- 反斜線加上普通字符用作
正則表達式時,需要一些選項來說明;如grep使用時,雖不需要加選項 -E,但需要加上選項 -P。實際上 -P也是表示后面樣式為某種擴展正則表達式。其次,也并不是所用的反斜線加上普通字符用作正則表達式在被grep使用時都需要加上 -P選項。 - 上
\w和\W是互補的,\d和\D是互補的,\s和\S是互補的。 - 表中從
\b開始,定義模式就不是很常用了,但是在某些場合使用這些表達式可能有奇效。
二、使用方法和案例
在Linux自建命令中,三劍客算是最常使用正則表達式的命令了,下面使用grep、sed、和gawk命令來說明其用法。
1 、grep
所需文本如下
# 文本示例
/home/weifexie/home/try [204]: ls usb4_sc0_t_0.v
usb4_sc0_t_0.v
/home/weifexie/home/try [206]: cat usb4_sc0_t_0.v
//module usb4_sc0_t_0 ( USB4_Router_ID_IN , USB4RT_0_DbgBlkId ,
module usb4_sc0_t ( USB4_Router_ID_IN , USB4RT_0_DbgBlkId ,
input [3:0] USB4_Router_ID_IN ;
input [7:0] USB4RT_0_DbgBlkId ;
sdx_cio0_t_0 sdx_cio0_t ( .USB4_Router_ID_IN ( USB4_Router_ID_IN ) ,
.USB4RT_0_DbgBlkId ( USB4RT_0_DbgBlkId ) ,
# endgrep示例 反斜線加上普通字符用作普通正則表達式,grep命令不需要加選項
# \b、\w、\W、\s、\S的用法,不需要grep加上選項,正則表達式是被看作是普通的正則表達式使用 # 注釋:\b是modul的左邊錨定,\w可是匹配字母e,\W匹配空格,\s匹配空格,\S可以匹配字母和下劃線 /home/weifexie/home/try [265]: grep '//*\bmodul\w*\W[a-z0-9_]*_[0-9]\s(\s\S\S\S[0-9]\S' usb4_sc0_t_0.v //module usb4_sc0_t_0 ( USB4_Router_ID_IN , USB4RT_0_DbgBlkId , ---分隔 # 注釋:\b是modul的右邊錨定,原文為module,故匹配為空 /home/weifexie/home/try [268]: grep '//*\bmodul\b\w*\W[a-z0-9_]*_[0-9]\s(\s\S\S\S[0-9]\S' usb4_sc0_t_0.v ---分隔 # 注釋:\B是modul的右邊錨定,表示modul右邊未結(jié)束, /home/weifexie/home/try [269]: grep '//*\bmodul\B\w*\W[a-z0-9_]*_[0-9]\s(\s\S\S\S[0-9]\S' usb4_sc0_t_0.v //module usb4_sc0_t_0 ( USB4_Router_ID_IN , USB4RT_0_DbgBlkId ,
匹配樣式代碼和執(zhí)行結(jié)果,帶顏色

grep示例 反斜線加上普通字符用作擴展正則表達式,grep需要加選項 -P
# 注釋:\d匹配數(shù)字,但是grep沒有使用 -P選項,故匹配不成功 /home/weifexie/home/try [272]: grep '//*\bmodul\B\w*\W[a-z0-9_]*_[0-9]\s(\s\S\S\S\d\S' usb4_sc0_t_0.v ---分隔符 # 注釋:\d匹配數(shù)字,grep使用 -P選項,grep命令出錯,顯示左小括號(需要一個右小括號組成一個小括號用作分組匹配,分組匹配是擴展表達式的內(nèi)容, #-P選項是將樣式認定為擴展表達式,出錯的原因是因為系統(tǒng)覺得少了右小括號,若只保留左小括號作為普通符號使用的話,需要使用轉(zhuǎn)義符 /home/weifexie/home/try [273]: grep -P '//*\bmodul\B\w*\W[a-z0-9_]*_[0-9]\s(\s\S\S\S\d\S' usb4_sc0_t_0.v grep: missing ) ---分隔符 # 使用轉(zhuǎn)義符轉(zhuǎn)義左小括號,\d匹配數(shù)字4 /home/weifexie/home/try [274]: grep -P '//*\bmodul\B\w*\W[a-z0-9_]*_[0-9]\s\(\s\S\S\S\d\S' usb4_sc0_t_0.v //module usb4_sc0_t_0 ( USB4_Router_ID_IN , USB4RT_0_DbgBlkId ,
匹配樣式代碼和執(zhí)行結(jié)果,帶顏色

將會:會使用另一文詳細的介紹grep命令的選項和用法
2、sed
所需文本同上
sed示例 反斜線加上普通字符用作普通正則表達式,sed不需要選項
# 文本同上
/home/weifexie/home/try [350]: cat usb4_sc0_t_0.v
//module usb4_sc0_t_0 ( USB4_Router_ID_IN , USB4RT_0_DbgBlkId ,
module usb4_sc0_t ( USB4_Router_ID_IN , USB4RT_0_DbgBlkId ,
input [3:0] USB4_Router_ID_IN ;
input [7:0] USB4RT_0_DbgBlkId ;
sdx_cio0_t_0 sdx_cio0_t ( .USB4_Router_ID_IN ( USB4_Router_ID_IN ) ,
.USB4RT_0_DbgBlkId ( USB4RT_0_DbgBlkId ) ,
---
# 注釋:-n 作用是sed執(zhí)行的部分才會顯示,p表示打印,\b和\B同上,\w匹配字母e,\w匹配下劃線,\s匹配空格,\S匹配下劃線,\W匹配逗號
/home/weifexie/home/try [351]: sed -n '/\bmodul\B\w\s[a-z0-9]*\wsc[0-9]_t\b\s( USB[0-9]\w[a-zA-Z]*_[A-Z]*\S[A-Z]*\s\W/p' usb4_sc0_t_0.v
module usb4_sc0_t ( USB4_Router_ID_IN , USB4RT_0_DbgBlkId ,
---
# s///g表示將匹配上的文本替換成指定的文本,下命令意思是將上命令匹配到的文本用iloveu進行替換,即
# “module usb4_sc0_t ( USB4_Router_ID_IN ,”被文本“iloveu”替換
/home/weifexie/home/try [352]: sed -n 's/\bmodul\B\w\s[a-z0-9]*\wsc[0-9]_t\b\s( USB[0-9]\w[a-zA-Z]*_[A-Z]*\S[A-Z]*\s\W/iloveu/gp' usb4_sc0_t_0.v
iloveu USB4RT_0_DbgBlkId ,
sed示例 反斜線加上普通字符用作擴展正則表達式,sed命令需要加選項 -r
# \D即使sed 加上-r也無法使用,\d即使sed 加上-r也無法使用,沒有文本能和\D和\d匹配,說明sed -r 不支持 /home/weifexie/home/try [378]: sed -n -r '/\bmodul\B\w\s[a-z0-9]*\wsc[0-9]_t\b\s\( US\D[0-9]\w[a-zA-Z]*_[A-Z]*\S[A-Z]*\s\W/p' usb4_sc0_t_0.v --- /home/weifexie/home/try [379]: sed -n -r '/\bmodul\B\w\s[a-z0-9]*\wsc[0-9]_t\b\s\( USB\d\w[a-zA-Z]*_[A-Z]*\S[A-Z]*\s\W/p' usb4_sc0_t_0.v --- # sed -r 支持擴展表達式分組符號 /home/weifexie/home/try [380]: sed -n -r '/\bmodul\B\w\s[a-z0-9]*\wsc[0-9]_t\b\s\( USB[0-9]\w[a-zA-Z]*_[A-Z]*\S[A-Z]*\s\W/p' usb4_sc0_t_0.v module usb4_sc0_t ( USB4_Router_ID_IN , USB4RT_0_DbgBlkId , /home/weifexie/home/try [381]: sed -n -r 's/\bmodul\B\w\s[a-z0-9]*\wsc[0-9]_t\b\s\( USB[0-9]\w[a-zA-Z]*_[A-Z]*\S[A-Z]*\s\W/iloveu/pg' usb4_sc0_t_0.v iloveu USB4RT_0_DbgBlkId ,
sed -r支持擴展表達式。
將會:會使用另一文詳細的介紹sed命令的選項和用法
3、gawk
提示:gawk和awk區(qū)別筆友有很多介紹,這里不做介紹,一言以蔽之,gawk是GNU下的功能更強大的awk版本。
所用文本如下
/home/weifexie/shell_tra [402]: cat phonelist (010)0751-075 (010) 0751-075 010-0751-075 010.0751.075 (021)0751-075 (021) 0751-075 021-0751-075 021.0751.075 (0751)0751-075 (0751) 0751-075 0751-0751-075 0751.0751.075 [751.0751.075 0751.751.075 0751.0751.-75
gawk命令支持普通的正則表達式
gawk命令加上 -r 支持擴展正則表達式,但不支持\d和\D
代碼執(zhí)行如下:
# 下gawk的功能是將匹配/^\(?((010)|(02[0-9])|([0-9]{4}))\)?(| |-|\.)[0-9]{4}(\S|\.)[0-9]{3}$/樣式的phonelist文本行打印出來
/home/weifexie/shell_tra [410]: cat phonelist | gawk -r '/^\(?((010)|(02[0-9])|([0-9]{4}))\)?(| |-|\.)[0-9]{4}(-|\.)[0-9]{3}$/ {print $0}'
(010)0751-075
(010) 0751-075
010-0751-075
010.0751.075
(021)0751-075
(021) 0751-075
021-0751-075
021.0751.075
(0751)0751-075
(0751) 0751-075
0751-0751-075
0751.0751.075
---分隔符
# \w匹配0,\s匹配空格,\W匹配短線-,\S匹配短線-
/home/weifexie/shell_tra [411]: cat phonelist | gawk -r '/^\(?((\w10)|(02[0-9])|([0-9]{4}))\)?(|\s|\W|\.)[0-9]{4}(\S|\.)[0-9]{3}$/ {print $0}'
(010)0751-075
(010) 0751-075
010-0751-075
010.0751.075
(021)0751-075
(021) 0751-075
021-0751-075
021.0751.075
(0751)0751-075
(0751) 0751-075
0751-0751-075
0751.0751.075
---分隔符# gawk -r 使用/^\d/樣式?jīng)]有匹配到文本,\d和\D不被支持
/home/weifexie/shell_tra [412]: cat phonelist | gawk -r '/^\(?((\w10)|(02[0-9])|([0-9]{4}))\)?(|\s|\W|\.)[0-9]{4}(\S|\.)[0-9]{3}$/ {print $0}' | gawk -r '/^\d/ {print $0}'
---分隔符
# gawk -r 支持使用/^[0-9]/樣式
/home/weifexie/shell_tra [413]: cat phonelist | gawk -r '/^\(?((\w10)|(02[0-9])|([0-9]{4}))\)?(|\s|\W|\.)[0-9]{4}(\S|\.)[0-9]{3}$/ {print $0}' | gawk -r '/^[0-9]/ {print $0}'
010-0751-075
010.0751.075
021-0751-075
021.0751.075
0751-0751-075
0751.0751.075不常用的正則表達式
用一段代碼對這些表達式有一個直觀的認識,有印象即可,用時候查詢。
/home/weifexie/home/try [231]: echo "1\v1" 1 1 /home/weifexie/home/try [232]: echo "1\n1" 1 1 /home/weifexie/home/try [233]: echo "1\f1" 1 1 /home/weifexie/home/try [234]: echo "1\r1" 1 /home/weifexie/home/try [235]: echo "1\t1" 1 1
注釋1:\r 右邊的1和左邊的1重復(fù)了,故看似只是echo了一次。\r指的是鼠標光標移到起始位置,echo -n 表示將該行行尾的換行符去掉。
注釋2:\v和\f顯示的結(jié)果很類似,二者之間的差異,==可能之后還會補充==
總結(jié)
linux正則表達式,有普通的正則表達式和擴展正則表達式,再加上反斜線加普通字符作為正則表達式這一用法,掌握后即可進行下一部分學(xué)習了。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
關(guān)于Windows 不能在 本地計算器 啟動 Apache2(phpstudy)
今天在自己的本子上準備放多個虛擬站點。用的是#phpstudy#。在軟件自身的站點設(shè)置中,根據(jù)提示添加的多站點無效不知道是否和我的系統(tǒng)是Win7有關(guān)2012-09-09
centos配置mutt和msmtp實現(xiàn)郵件發(fā)送
這篇文章主要為大家詳細介紹了centos配置mutt和msmtp實現(xiàn)郵件發(fā)送,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-11-11
Linux 下載安裝VSCode 使用編程輸出當前時間的方法
這篇文章主要介紹了Linux 下載安裝VSCode 使用編程輸出當前時間,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學(xué)習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-06-06
-bash:/usr/bin/yum:沒有那個文件或目錄的解決方案
在CentOS系統(tǒng)中,不慎刪除或卸載了yum可以通過重新安裝來恢復(fù),首先,確認系統(tǒng)版本,例如CentOS,然后新建所需目錄以存放下載的文件,接下來,分別從鏡像源下載yum組件和python依賴的rpm包,安裝python時,如果遇到依賴問題,可選擇強制安裝2024-10-10

