linux shell中正規表示式的使用

2021-09-30 12:27:19 字數 1725 閱讀 3055

今天在學習正規表示式時發現,grep對正規表示式的解釋和我想到的不同。

我本來打算用\來匹配the,但卻沒有匹配任何文字,上網也沒有查到資料。

通過對於某乙個檔案的試驗,我發現了原因:

在shell中使用grep的解析順序是這樣的:

1. shell首先會解析有沒有元字元,如: grep p * 會檢查當前目錄中所有檔案,並返回帶有p的行,而且高亮顯示p。

3. 遵循正規表示式的語法進行解析,在這時才真正開始解析正規表示式,也就是說這時\才會被理解成恰好匹配the這個字串。

換句話說,如果要在shell中使用正規表示式,要先經過shell的解釋(interpert),如果有shell中的元字元,而你又不想讓shell解釋他,那麼你要先轉義一次。

例如mastering_regex_note_log.txt這個檔案:

$ cat mastering_regex_note_log.txt

返回9-18 p29

9-18 p35

不要把^cat理解成匹配以cat開頭的行,應該認為^cat匹配以c為一行的第乙個字元,緊接著乙個c,緊接著乙個t的文字。

9-18 p37

9-19 p41

\$ cat mastering_regex_note_log.txt | grep \

不返回任何值

$ cat mastering_regex_note_log.txt | grep \\\

或$ cat mastering_regex_note_log.txt | grep '\'

返回9-18

p29另外,如果shell不把某個字元當作特殊字元或不能解析,就會直接交給grep

cat mastering_regex_note_log.txt | grep .返回

9-18 p29

9-18 p35

不要把^cat理解成匹配以cat開頭的行,應該認為^cat匹配以c為一行的第乙個字元,緊接著乙個c,緊接著乙個t的文字。

9-18 p37

9-19 p41 \

cat mastering_regex_note_log.txt | grep \.同樣返回

9-18 p29

9-18 p35

不要把^cat理解成匹配以cat開頭的行,應該認為^cat匹配以c為一行的第乙個字元,緊接著乙個c,緊接著乙個t的文字。

9-18 p37

9-19 p41

\而cat mastering_regex_note_log.txt | grep \\.

不返回任何值,因為這時grep在檔案中沒有找到'.'這個字元。

cat mastering_regex_note_log.txt | grep \\.*返回

9-18 p29

9-18 p35

不要把^cat理解成匹配以cat開頭的行,應該認為^cat匹配以c為一行的第乙個字元,緊接著乙個c,緊接著乙個t的文字。

9-18 p37

9-19 p41

\因為'.'這個字元出現了0次,所以匹配任何文字,但都不高亮顯示

另乙個例子是cat 1 | grep $,返回

this is $

cat 1 | grep \$,cat 1 | grep 同樣返回

this is $

而cat 1 | grep \\$,cat 1 | grep \\\$和cat 1 | grep '\$'返回

this is

$和上面是一樣的道理。

JS中正規表示式

js中正規表示式有幾種不同的使用方法,一些用法是通過字串物件來使用,另外一些通過正規表示式物件使用。一 regexp 正規表示式 的屬性和方法 1 屬性 regexp的例項有幾個唯讀的屬性 global表示是否為全域性匹配,igorecase表示是否忽略大小寫,multiline表示是否為多行匹配,...

PHP中正規表示式

正規表示式一般表示式的形式如下 love 其中位於 定界符之間的部分就是將要在目標物件中進行匹配的模式。為了能夠使使用者更加靈活的的定製模式內容,正規表示式提供了專門的 元字元 所謂元字元就是指那些表示式中具有特殊意義的字元,可以用來規定其前導字元 即在元字元前面的字元 在目標物件中的出現模式。較為...

python中正規表示式

python中正規表示式語法與linux中的相容 檢視正規表示式 python提供re模組,包含所有正規表示式的功能。由於python的字串本身也用 轉義,所以要特別注意 s abc 001 python的字串 對應的正規表示式字串變成 abc 001 建議使用python的r字首,就不用考慮轉義的...