亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Linux通配符與正則表達(dá)式的區(qū)別及使用說明

 更新時(shí)間:2025年04月17日 09:38:44   作者:麥冬1897  
這篇文章主要介紹了Linux通配符與正則表達(dá)式的區(qū)別及使用說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

背景

在linux使用過程中,經(jīng)常需要查找文件,對(duì)命令中的通配符 pattern 和正則表達(dá)式的區(qū)分不是很清楚。有必要好好研究一下。

1 掃盲

通配符和正則表達(dá)式

當(dāng)在使用命令行時(shí),有很多時(shí)間都用來查找你所需要的文件,如 ls find 等。 Shell 提供了一套完整的字符串模式匹配規(guī)則,或者稱之為元字符,當(dāng) Shell 遇到上述字符時(shí),就會(huì)把它們當(dāng)作特殊字符,而不是文件名中的普通字符,這樣用戶就可以用它們來匹配相應(yīng)的文件名,我理解這可以稱為通配符。

通配符與正則表達(dá)式是有區(qū)別的,簡單來說:通配符是用來通配的,正則表達(dá)式是用來匹配字符串的;

通配符是shell自帶的用于匹配文件名的工具,多用在文件名上,比如查找find,ls,cp 等等,而正則表達(dá)式則需要特定命令的支持才可以使用,如:grep、sedawk(號(hào)稱Linux三劍客)、vi/vim、perl等,這些都是處理文本的工具。

其次,shell對(duì)通配符與正則表達(dá)式的處理也有不同,“ ”內(nèi)一般為通配符(是shell本身提取處理),‘ ’內(nèi)一般為正則表達(dá)式(shell會(huì)將其中的數(shù)據(jù)傳遞給其它命令處理)。

通配符

常見元字符:

  • *:匹配零或多個(gè)任意字符
  • ?:匹配任意單個(gè)字符
  • []:指定中括號(hào)內(nèi)的多個(gè)字符,如:[rwc]或[r,w,c]都行
  • [^][!]:除了中括號(hào)內(nèi)字符外匹配任一個(gè)字符

引用以下模式要在外面再套一個(gè)[],tr命令則不用(這是規(guī)定嗎?)

  • [:digit:]:匹配任意一個(gè)數(shù)字
  • [:lower:]:任意小寫字符
  • [:upper:]:任意大寫字符
  • [:alpha:]:任意大小寫字母
  • [:alnum:]:任意一個(gè)字母或數(shù)字
  • [:space:]:一個(gè)空格
  • [:punct:]:標(biāo)點(diǎn)符號(hào)

正則表達(dá)式

這里不具體介紹正則表達(dá)式,只是說一下和通配符的區(qū)別

首先通配符沒有次數(shù)匹配

  • *:匹配前面的字符零次或多次 
  • .:匹配任意一個(gè)字符
  • ?:前面的字符零次或一次,基本正則是?
  • +:前面的字符至少一次,基本正則是+
  • []:和通配符完全一樣
  • [^]:和通配符一樣,但是沒有[!]的寫法

2 通配符詳細(xì)介紹

測試數(shù)據(jù)

touch a a6.log abc.log ac.txt b c c5.txt x.log A

* 代表任意多個(gè)字符

  • 例:查詢以 .log 結(jié)尾的文件 ll *.log

? 代表任意單個(gè)字符

  • 例:只查詢 a、b、c ll ?

[] 代表 [] 之間的某一個(gè)字符,比如[0-9]可以代表0-9之間的任意一個(gè)數(shù)字,[a-zA-Z]可以代表a-zA-Z之間的任意一個(gè)字母,字母區(qū)分大小寫。

  • 例:只查詢字母文件 ll [a-zA-Z]
  • 例:查詢以 .log 結(jié)尾且 .log 前只有兩個(gè)字符的文件且第二個(gè)字符是數(shù)字 ll ?[0-9].log

^ 表示匹配結(jié)果取反的意思,注意這個(gè)通配符必須要在[]中使用

  • 例:查詢不是以 .txt 結(jié)尾的文件 ll *[^txt]*

{} 表示符合括號(hào)內(nèi)包含的多個(gè)文件

  • 例:查詢.log.txt 結(jié)尾的文件 ll {*.log,*.txt}

注意: .這個(gè)符合比較特殊,如果匹配的條件加上了該符合那么說明查詢結(jié)果文件就包含帶.的文件

例如前面的^的例子,如果我這樣查詢ll *.[^txt]*,那么結(jié)果就不一樣了

刪除操作

  • 例如:刪除a、b、c和以.txt結(jié)尾的文件 
rm -f {[abc],*.txt}

當(dāng)然既然可以查詢當(dāng)然也可以使用通配符匹配的方式進(jìn)行移動(dòng)文件,如果需要在存在很多文件的文件夾中移動(dòng)某些類型的文件那么使用通配符匹配的效率就顯而易見了;當(dāng)時(shí)通配符的使用技巧不單單只有這些,有空的可以多去研究。

3 實(shí)例

  • * 匹配文件名中的任何字符串,包括空字符串。
  • ? 匹配文件名中的任何單個(gè)字符。
  • [...] 匹配[ ]中所包含的任何字符。
  • [!...] 匹配[ ]中非感嘆號(hào)!之后的字符。和^的效果一樣

如:

  • 5* 5開頭的所有字符串
  • *5 5結(jié)尾的所有字符串
  • *5? 以5為倒數(shù)第二個(gè)字符的字符串
  • [0-9] 所有以數(shù)字的字符
  • [1,2] 1或者2
  • [!0-9] 不是數(shù)字的字符
  • ls /etc/[!a-n]*.conf 列出/etc/目錄中不是以字母a到n開頭的,并且以.conf結(jié)尾的文件
  • ls /etc/[a-n]*.conf 列出/etc/目錄中以字母a到n開頭的,并且以.conf結(jié)尾的文件
  • ls /bin/[ck]* 列出以 c或k開頭的文件名

4 正則表達(dá)式詳細(xì)介紹

正則表達(dá)式(也稱為“regex”或“regexp”)是一種用來描述文本模式的特殊語法。

在 Linux 系統(tǒng)上,正則表達(dá)式通常被用來查找文本的模式,以及對(duì)文本流執(zhí)行“搜索-替換”操作以及其它功能。

簡單字串

$ 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 的第一個(gè)參數(shù)是一個(gè)正則表達(dá)式;第二個(gè)參數(shù)是一個(gè)文件名。grep 讀取 /etc/passwd 中的每一行并對(duì)它應(yīng)用簡單子串正則表達(dá)式 bash 來查找匹配項(xiàng)。如果找到一個(gè)匹配項(xiàng),那么 grep 打印出整行;否則,忽略該行。

理解簡單子串

一般來說,如果您正在搜索一個(gè)子串,那么您可以不提供任何“特殊”字符,而只是逐字地指定文本。只有在子串包含 +、.、*、[、]/(在這樣的情況下,這些字符需要用引號(hào)括起來并在它們的前面使用反斜杠)才需要做特殊的事情。

下面是簡單子串正則表達(dá)式幾個(gè)其它示例:

  tmp (掃描查找文字串 tmp)        
“\[box\]”(掃描查找文字串 [box])        
“\*funny\*”(掃描查找文字串 *funny*)        
“l(fā)d\.so”(掃描查找文字串 ld.so)

元字符

使用正則表達(dá)式,可以利用元字符來執(zhí)行比我們至今已研究過的示例復(fù)雜得多的搜索。這些元字符中的一個(gè)是 .(點(diǎn)),它與任何單個(gè)字符匹配:

$ 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 沒有出現(xiàn)在 /etc/fstab 中的任何一行中。但是,grep 掃描這些行時(shí)沒有查找文字 dev.hda 字符串,而是查找 dev.hda 模式。請(qǐng)記住 . 將與任何單個(gè)字符相匹配。正如您看到的,. 元字符在功能上等價(jià)于 glob 擴(kuò)展中 ? 元字符的工作原理。

使用 []

如果我們希望與比 . 更具體一點(diǎn)地來匹配字符,那么我們可以使用 [ 和 ](方括號(hào))來指定要匹配的字符子集:

$ grep dev.hda[12] /etc/fstab        
/dev/hda1 /boot reiserfs noauto,noatime,notail 1 2        
/dev/hda2 swap swap sw 0 0  

[\u4e00-\u9fa5] : 表示任意一個(gè)漢字

正如您看到的,這個(gè)特殊語法的作用與glob文件名擴(kuò)展中的 [] 相同。

使用 [^]

通過使 [ 后面緊跟一個(gè) ^,您可以使方括號(hào)中的意思相反。在本例中,方括號(hào)將與未列在方括號(hào)內(nèi)的任意字符匹配。同樣,請(qǐng)注意我們?cè)谡齽t表達(dá)式中使用 [^] ,而在 glob 中使用 [!] :

$ grep dev.hda[^12] /etc/fstab        
/dev/hda3 reiserfs noatime,ro 1 1        
/dev/hda4 /mnt/extra reiserfs noatime,rw 1 1   

區(qū)別語法

注意下面一點(diǎn)很重要:方括號(hào)內(nèi)部的語法根本不同于正則表達(dá)式其它部分中的語法。

例如,如果在方括號(hào)內(nèi)放置一個(gè) . ,那么它允許方括號(hào)與文字 . 匹配,就象上面示例中的 1 和 2。比較起來,除非有\(zhòng) 作為前綴,否則方括號(hào)外面的文字 . 被解釋為一個(gè)元字符。通過輸入如下命令,我們可以利用這一事實(shí)來打印 /etc/fstab 中包含文字串 dev.hda 的所有行的列表:

$ grep dev[.]hda /etc/fstab

或者,我們也可以輸入:

$ grep "dev\.hda" /etc/fstab

這兩個(gè)正則表達(dá)式都不可能與您的 /etc/fstab 文件中的任何行相匹配。

*元字符

某些元字符本身不匹配任何字符,但卻修改前一個(gè)字符的含義。一個(gè)這樣的元字符是 * (星號(hào)),它用來與前一個(gè)字符的零次或者多次重復(fù)出現(xiàn)相匹配。

這里是一些示例:

  • 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 行與正則表達(dá)式 ab*c 相匹配,因?yàn)樾翘?hào)也允許前面的表達(dá)式 b 出現(xiàn)零次。請(qǐng)注意解釋 * 正則表達(dá)式元字符所用的方法與解釋 * glob 字符的方法根本不同。

行的開始和結(jié)束

我們?cè)谶@里要詳細(xì)描述的最后幾個(gè)元字符是 ^$ 元字符,它們用來分別與行的開始和結(jié)束相匹配。通過在正則表達(dá)式開始處使用一個(gè) ^ ,您可以將您的模式“錨定”在行的開始。

在下面的示例中,我們使用 ^# 正則表達(dá)式來與以 # 字符開始的任何行相匹配:

$ grep ^# /etc/fstab        
# /etc/fstab: static file system information.        
#

完整行正則表達(dá)式

可以組合 ^$ 來與完整的行相匹配。

例如,下面的正則表達(dá)式將與以 # 字符開始并以. 字符結(jié)束的行相匹配,在其中間可以有任意多個(gè)其它字符:

$ grep '^#.*/.$' /etc/fstab        
# /etc/fstab: static file system information.  

在上面的示例中,我們用單引號(hào)將我們的正則表達(dá)式括起來以阻止 shell 解釋 $ 。

在不使用單引號(hào)的情況下,grep 甚至沒有機(jī)會(huì)查看 $,$ 就從我們的正則表達(dá)式上消失了。

正則總結(jié)

元字符

  • . :小數(shù)點(diǎn)可以匹配除\n以外的任意一個(gè)字符。如果要匹配包括\n在內(nèi)的所有字符,一般用[\s\S],或者是用.(?s)匹配模式來實(shí)現(xiàn)。 
  • [abc] :匹配方括號(hào)中的任意一個(gè)字符??梢允褂?表示字符范圍,如[a-z0-9]匹配小寫字母和阿拉伯?dāng)?shù)字。 
  • [^abc] :在方括號(hào)內(nèi)開頭使用 ^ 符號(hào),表示匹配除方括號(hào)中字符之外的任意字符。 | : 表示或 
  • \d 匹配阿拉伯?dāng)?shù)字,等同于[0-9]。 
  • \D 匹配阿拉伯?dāng)?shù)字之外的任意字符,等同于[^0-9]。 
  • \x 匹配十六進(jìn)制數(shù)字,等同于[0-9A-Fa-f]。 
  • \X 匹配十六進(jìn)制數(shù)字,等同于[^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]

表示數(shù)量的元字符

元字符 說明

  • * 匹配 0-任意個(gè) 
  • \+ 匹配 1-任意個(gè) 
  • \? 匹配 0-1個(gè) 
  • \{n,m\} 匹配 n-m個(gè) 
  • \{n\} 匹配 n個(gè) 
  • \{n,\} 匹配 n-任意個(gè) 
  • \{,m\} 匹配 0-m個(gè)

換行符 說明

  • \r,\n 回車和換行
  • \\ 匹配\ 
  • \^,\$,\. 匹配^ $ .

以下字符在匹配其本身時(shí),通常需要進(jìn)行轉(zhuǎn)義。

在實(shí)際應(yīng)用中,根據(jù)具體情況,需要轉(zhuǎn)義的字符可能不止如下所列字符 : $ ^ { [ ( | ) * + ? \

表示位置的符號(hào)

  • $ 匹配行尾 
  • ^ 匹配行首 
  • \< 匹配單詞詞首 
  • \> 匹配單詞詞尾 
  • \b 匹配單詞邊界

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • linux最快的文本搜索神器ripgrep(grep的最好代替者)

    linux最快的文本搜索神器ripgrep(grep的最好代替者)

    這篇文章主要介紹了linux最快的文本搜索神器ripgrep(grep的最好代替者),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • 解決Ubuntu 16.04下提示boot分區(qū)空間不足的辦法

    解決Ubuntu 16.04下提示boot分區(qū)空間不足的辦法

    最近看了看/boot的大小,發(fā)現(xiàn)幾次升級(jí)后,大小不足,所以想擴(kuò)容,一開始還想用磁盤操作,但上網(wǎng)查詢后發(fā)現(xiàn),磁盤操作實(shí)在風(fēng)險(xiǎn)太大,特別是雙系統(tǒng)的Linux,操作又是很麻煩,后來發(fā)現(xiàn)可以刪除多余的舊內(nèi)核來清理/boot,釋放空間。下面來看看詳細(xì)的解決方法吧。
    2017-02-02
  • 解決ubuntu安裝軟件時(shí),status-code=409報(bào)錯(cuò)的問題

    解決ubuntu安裝軟件時(shí),status-code=409報(bào)錯(cuò)的問題

    這篇文章主要介紹了解決ubuntu安裝軟件時(shí),status-code=409報(bào)錯(cuò)的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • 詳解linux 攝像頭驅(qū)動(dòng)編寫

    詳解linux 攝像頭驅(qū)動(dòng)編寫

    本篇文章主要介紹了詳解linux 攝像頭驅(qū)動(dòng)編寫,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-04-04
  • apache在win2003下的安全設(shè)置(配合文件夾權(quán)限目錄,很好很安全)

    apache在win2003下的安全設(shè)置(配合文件夾權(quán)限目錄,很好很安全)

    眾所周知,在windows下當(dāng)Apache第 一次被安裝為服務(wù)后,它會(huì)以用戶“System”(本地系統(tǒng)賬號(hào))運(yùn)行。如果web服務(wù)器的所有資源都在本地系統(tǒng)上,這樣做會(huì)問題比較少,但是將會(huì)具有很 大的安全 權(quán)限來影響本地機(jī)器,因此千萬不能開啟System帳號(hào)的網(wǎng)絡(luò)權(quán)限
    2012-01-01
  • Linux下Python腳本自啟動(dòng)和定時(shí)啟動(dòng)的詳細(xì)步驟

    Linux下Python腳本自啟動(dòng)和定時(shí)啟動(dòng)的詳細(xì)步驟

    這篇文章主要介紹了Linux下Python腳本自啟動(dòng)和定時(shí)啟動(dòng)的詳細(xì)步驟,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-09-09
  • linux 程序、動(dòng)態(tài)庫、靜態(tài)庫內(nèi)部添加版本號(hào)和編譯時(shí)間詳解

    linux 程序、動(dòng)態(tài)庫、靜態(tài)庫內(nèi)部添加版本號(hào)和編譯時(shí)間詳解

    下面小編就為大家?guī)硪黄猯inux 程序、動(dòng)態(tài)庫、靜態(tài)庫內(nèi)部添加版本號(hào)和編譯時(shí)間詳解。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-12-12
  • Django上線部署之Apache的方法

    Django上線部署之Apache的方法

    這篇文章主要介紹了Django上線部署之Apache的相關(guān)知識(shí),非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-08-08
  • Linux中的信號(hào)(注冊(cè),注銷,處理,阻塞)

    Linux中的信號(hào)(注冊(cè),注銷,處理,阻塞)

    這篇文章主要介紹了Linux中的信號(hào)(注冊(cè),注銷,處理,阻塞),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • apache實(shí)現(xiàn)部署多個(gè)網(wǎng)站(一個(gè)ip部署多域名)的方法詳解

    apache實(shí)現(xiàn)部署多個(gè)網(wǎng)站(一個(gè)ip部署多域名)的方法詳解

    最近去機(jī)房幫別人配置網(wǎng)站,機(jī)房的服務(wù)器本身已經(jīng)搭建了一個(gè)網(wǎng)站,我們需要再配置一個(gè),所以記錄下來,這篇文章主要給大家介紹了關(guān)于apache如何實(shí)現(xiàn)部署多個(gè)網(wǎng)站(一個(gè)ip部署多域名)的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-11-11

最新評(píng)論