今天在學習正規表示式時發現,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字首,就不用考慮轉義的...