通配符是系統level的 而正則表達式需要相關工具的支持: egrep, awk, vi, perl。在文本過濾工具里,都是用正則表達式,比如像awk,sed等,是針對文件的內容的。通配符多用在文件名上,比如查找find,ls,cp,等等。
1.通配符
(1)通配符語法:*
* 將與零個或多個字符匹配。這就是說“什么都可以”。例子:
/etc/g* 與 /etc 中以 g 開頭的所有文件匹配。
/tmp/my*1 與 /tmp 中以 my 開頭,并且以 1 結尾的所有文件匹配。
(2)通配符語法:?
? 與任何單個字符匹配。例子:
myfile? 與文件名為 myfile 后跟單個字符的任何文件匹配。
/tmp/notes?txt 將與 /tmp/notes.txt 和 /tmp/notes_txt 都匹配,如果它們存在。
(3)通配符語法:[]
該通配符與 ? 相似,但允許指定得更確切。要使用該通配符,把您想要匹配的所有字符放在 [] 內。結果的表達式將與 [] 中任一字符相匹配。您也可以用 – 來指定范圍,甚至還可以組合范圍。例子:
myfile[12] 將與 myfile1 和 myfile2 匹配。只要當前目錄中至少有一個這樣的文件存在,該通配符就可以進行擴展。
[Cc]hange[Ll]og 將與 Changelog、ChangeLog、changeLog 以及 changelog 匹配。您可以看到,與大寫形式的變形匹配時,使用括弧通配符很有用。
ls /etc/[0-9]* 將列出 /etc 中以數字開頭的所有文件。
ls /tmp/[A-Za-z]* 將列出 /tmp 中以大寫字母或小寫字母開頭的所有文件。
(4)通配符語法:[!]
除了不與括弧中的任何字符匹配外,[!] 構造與 [] 構造類似,只要不是列在 [! 和 ] 之間的字符,它將與任何字符匹配。例子:
rm myfile[!9] 將刪除除 myfile9 之外的名為 myfile 加一個字符的所有文件。
通配符告誡說明
這里有一些使用通配符時應該注意的告誡說明。由于 bash 對與通配符相關的字符(?、[、]、*)進行特別處理,因此您將包含這些字符的參數輸入到命令中時,需要特別小心。例如,如果您想要創建一個包含字符串 [fo]* 的文件,下面這個命令可能不會執行您想要做的事:
$ echo [fo]* > /tmp/mynewfile.txt
如果 [fo]* 這個模式與當前工作目錄中的任何文件匹配,那么您將在 /tmp/mynewfile.txt 內發現那些文件的名稱,而不是您所期望的文字 [fo]*。解決方法是什么呢?嗯,一種方法是用單引號把這些字符括起來,這將告訴 bash 單純地執行,而不會對其進行通配符擴展:
$ echo '[fo]*' > /tmp/mynewfile.txt
采用這種方法,您的新文件將包含所期望的文字的 [fo]*。另一種方法是,您可以使用反斜杠,告訴 bash [、] 和 * 應該被當成文字處理,而不是被當成通配符處理:
$ echo \[fo\]\* > /tmp/mynewfile.txt
兩種方法都能同樣地起作用。既然我們談到反斜杠擴展,那么現在是時候提一提了,為了指定文字\,您可以將它放入單引號中,或者也可以輸入\\(它將被擴展為\)。
請注意雙引號的作用和單引號很接近,而雙引號還允許 bash 做一些有限的擴展。因此,當您確實想要把文字文本傳給命令時,單引號是最好的選擇。
(5)專用字符集合
[:digit:]:任意數字,相當于0-9
[:lower:]:任意小寫字母
[:upper:]:任意大寫字母
[:alpha:]:任意大小寫字母
[:alnum:]:任意數字或字母
[:space:]:空格
[:punct:]:標點符號
注意:引用時,需要在加一層括號
2.正則表達式
1、什么是正則表達式?
正則表達式(也稱為“regex”或“regexp”)是一種用來描述文本模式的特殊語法。在 Linux 系統上,正則表達式通常被用來查找文本的模式,以及對文本流執行“搜索-替換”操作以及其它功能。
2、與 glob 的比較
當我們看到正則表達式時,您可能發現正則表達式的語法看起來與我們上一篇教程(請參閱本教程最后的“參考資料”一節中列出的“第 1 部分”)中研究的“文件名匹配替換”語法相類似。但是,不要讓它欺騙您;它們的類似性只是表面的。雖然正則表達式和文件名匹配替換模式可能看上去相類似,但是它們是根本不同的兩種類型。
3、簡單子串
記住那個警告,讓我們看一下最基本的正則表達式,簡單子串。為了這樣做,我們要使用 grep,它是一個掃描文件內容來查找適合特定正則表達式的命令。grep 打印與正則表達式匹配的每一行,并忽略與之不匹配的每一行:
$ grep bash /etc/passwd
operator:x:11:0:operator:/root:/bin/bash
root:x:0:0::/root:/bin/bash
ftp:x:40:1::/home/ftp:/bin/bash
在上面的命令中,grep 的第一個參數是一個正則表達式;第二個參數是一個文件名。grep 讀取 /etc/passwd 中的每一行并對它應用簡單子串正則表達式 bash 來查找匹配項。如果找到一個匹配項,那么 grep 打印出整行;否則,忽略該行。
4、理解簡單子串
一般來說,如果您正在搜索一個子串,那么您可以不提供任何“特殊”字符,而只是逐字地指定文本。只有在子串包含 +、.、*、[、] 或 /(在這樣的情況下,這些字符需要用引號括起來并在它們的前面使用反斜杠)才需要做特殊的事情。下面是簡單子串正則表達式幾個其它示例:
tmp (掃描查找文字串 tmp)
“\[box\]”(掃描查找文字串 [box])
“\*funny\*”(掃描查找文字串 *funny*)
“ld\.so”(掃描查找文字串 ld.so)
5、元字符
使用正則表達式,可以利用元字符來執行比我們至今已研究過的示例復雜得多的搜索。這些元字符中的一個是 .(點),它與任何單個字符匹配:
$ grep dev.hda /etc/fstab
/dev/hda3 reiserfs noatime,ro 1 1
/dev/hda1 /boot reiserfs noauto,noatime,notail 1 2
/dev/hda2 swap sw 0 0
#/dev/hda4 /mnt/extra reiserfs noatime,rw 1 1
在本示例中,文字文本 dev.hda 沒有出現在 /etc/fstab 中的任何一行中。但是,grep 掃描這些行時沒有查找文字 dev.hda 字符串,而是查找 dev.hda 模式。請記住 . 將與任何單個字符相匹配。正如您看到的,. 元字符在功能上等價于 glob 擴展中 ? 元字符的工作原理。
6、使用 []
如果我們希望與比 . 更具體一點地來匹配字符,那么我們可以使用 [ 和 ](方括號)來指定要匹配的字符子集:
$ grep dev.hda[12] /etc/fstab
/dev/hda1 /boot reiserfs noauto,noatime,notail 1 2
/dev/hda2 swap swap sw 0 0
[\u4e00-\u9fa5] : 表示任意一個漢字
正如您看到的,這個特殊語法的作用與“glob”文件名擴展中的 [] 相同。
7、使用 [^]
通過使 [ 后面緊跟一個 ^,您可以使方括號中的意思相反。在本例中,方括號將與未列在方括號內的任意字符匹配。同樣,請注意我們在正則表達式中使用 [^] ,而在 glob 中使用 [!] :
$ grep dev.hda[^12] /etc/fstab
/dev/hda3 reiserfs noatime,ro 1 1
/dev/hda4 /mnt/extra reiserfs noatime,rw 1 1
8、區別語法
注意下面一點很重要:方括號內部的語法根本不同于正則表達式其它部分中的語法。例如,如果在方括號內放置一個 . ,那么它允許方括號與文字 . 匹配,就象上面示例中的 1 和 2。比較起來,除非有\ 作為前綴,否則方括號外面的文字 . 被解釋為一個元字符。通過輸入如下命令,我們可以利用這一事實來打印 /etc/fstab 中包含文字串 dev.hda 的所有行的列表:
$ grep dev[.]hda /etc/fstab
或者,我們也可以輸入:
$ grep "dev\.hda" /etc/fstab
這兩個正則表達式都不可能與您的 /etc/fstab 文件中的任何行相匹配。
9、“*”元字符
某些元字符本身不匹配任何字符,但卻修改前一個字符的含義。一個這樣的元字符是 * (星號),它用來與前一個字符的零次或者多次重復出現相匹配。這里是一些示例:
ab*c(與 abbbbc 匹配但不與 abqc 匹配)
ab*c(與 abc 匹配但不與 abbqbbc 匹配)
ab*c(與 ac 匹配但不與 cba 匹配)
b[cq]*e(與 bqe 匹配但不與 eb 匹配)
b[cq]*e(與 bccqqe 匹配但不與 bccc 匹配)
b[cq]*e(與 bqqcce 匹配但不與 cqe 匹配)
b[cq]*e(與 bbbeee 匹配)
.*(與任何字符串匹配)
foo.*(與以 foo 開始的任何字符串相匹配)
ac 行與正則表達式 ab*c 相匹配,因為星號也允許前面的表達式(b)出現零次。請注意解釋 * 正則表達式元字符所用的方法與解釋 * glob 字符的方法根本不同。
10、行的開始和結束
我們在這里要詳細描述的最后幾個元字符是 ^ 和 $ 元字符,它們用來分別與行的開始和結束相匹配。通過在正則表達式開始處使用一個 ^ ,您可以將您的模式“錨定”在行的開始。在下面的示例中,我們使用 ^# 正則表達式來與以 # 字符開始的任何行相匹配:
$ grep ^# /etc/fstab
# /etc/fstab: static file system information.
#
11、完整行正則表達式
可以組合 ^ 和 $ 來與完整的行相匹配。例如,下面的正則表達式將與以 # 字符開始并以 . 字符結束的行相匹配,在其中間可以有任意多個其它字符:
$ grep '^#.*/.$' /etc/fstab
# /etc/fstab: static file system information.
在上面的示例中,我們用單引號將我們的正則表達式括起來以阻止 shell 解釋 $ 。在不使用單引號的情況下,grep 甚至沒有機會查看 $,$ 就從我們的正則表達式上消失了。
正則總結(轉)
元字符
. :小數點可以匹配除“\n”以外的任意一個字符。如果要匹配包括“\n”在內的所有字符,一般用[\s\S],或者是用“.”加(?s)匹配模式來實現。
[abc] :匹配方括號中的任意一個字符??梢允褂?表示字符范圍,如[a-z0-9]匹配小寫字母和阿拉伯數字。
[^abc] :在方括號內開頭使用^符號,表示匹配除方括號中字符之外的任意字符。 | : 表示或
\d 匹配阿拉伯數字,等同于[0-9]。
\D 匹配阿拉伯數字之外的任意字符,等同于[^0-9]。
\x 匹配十六進制數字,等同于[0-9A-Fa-f]。
\X 匹配十六進制數字,等同于[^0-9A-Fa-f]。
\w 匹配單詞字母,等同于[0-9A-Za-z_]。
\W 匹配單詞字母之外的任意字符,等同于[^0-9A-Za-z_]。
\t 匹配<TAB>字符。
\s 匹配空白字符,等同于[ /t]。
\S 匹配非空白字符,等同于[^ /t]。
\a 所有的字母字符. 等同于[a-zA-Z]
\l 小寫字母 [a-z]
\L 非小寫字母 [^a-z]
\u 大寫字母 [A-Z]
\U 非大寫字母 [^A-Z]
表示數量的元字符
元字符 說明
* 匹配0-任意個
\+ 匹配1-任意個
\? 匹配0-1個
\{n,m\} 匹配n-m個
\{n\} 匹配n個
\{n,\} 匹配n-任意個
\{,m\} 匹配0-m個
換行符 說明
\r,\n 回車和換行
\\ 匹配‘\’
\^,\$,\. 匹配“^”“$”“.”
以下字符在匹配其本身時,通常需要進行轉義。在實際應用中,根據具體情況,需要轉義的字符可能不止如下所列字符 : $ ^ { [ ( | ) * + ? \
表示位置的符號
$ 匹配行尾
^ 匹配行首
\< 匹配單詞詞首
\> 匹配單詞詞尾
\b 匹配單詞邊界
原創文章,作者:血刀老祖,如若轉載,請注明出處:http://www.www58058.com/11356
寫的不錯,你將擁有自主發布文章的權限,相信會一如既往的好