日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

正则表达式选项分析

發布時間:2025/5/22 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 正则表达式选项分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在使用Linux系統的時候我們常常需要對一些文本進行處理,但是有的時候文本特別長,所以我們需要找出我們需要的那些文本。grep命令就可以實現這個功能。

grep系列分為三種,分別是grep,egrep,fgrep,其中egrep和fgrep可以算是grep的衍生版,當grep加上一些特殊命令就變成了egrep和fgrep。這三種命令屬于文本搜索工具,基于給定的文本進行模糊搜索。

grep的全名為Global search REgular expression and Print out the line,中文意思就是利用正則表達式進行全局搜索并將匹配的行顯示出來。這個命令默認工作在貪婪模式下,也就是匹配所有可以匹配的內容,并顯示出匹配到的字符所在行的全部內容。格式為grep [OPTIONS] PATTERN [FILE...]。

OPTIONS為grep的選項,常用選項有:

-i,--ignore:忽略文本字符的大小寫;

?這個功能能夠用在當我們不想區分大小寫的地方,比如:匹配所有以大、小寫s字母

????????~]$?echo?sadSdaaea?|?grep?-i?"s"

????匹配結果:sadSdaaea

-v:反向匹配;最終顯示結果是PATTERN不能成功匹配的行;

???????比如:先創建一個包含以下內容的文本文檔“a”~]$?cat?a????????sdzxqw然后使用匹配命令~]$?grep?-v?"s"?a

??匹配結果:

????????zx

????????qw

-c --count:匹配PATTERN這個條件的行數;

????????????比如:可以使用上一個選項創建的“a”文件,然后執行命令:~]$?grep?-c?"s"?a

? ?匹配結果:

??????1

-o --only matching:關閉貪婪模式,僅顯示能夠匹配的內容;

????當我們在匹配的時候加上了這個選項,那么在顯示匹配結果的時候只會顯示匹配到的內容

????????比如:

????????????????????grep?-o?"s"?a

? ?匹配結果:?

??????s

????這個結果匹配到的行應該是sd,但是由于加上了-o選項,所以只顯示一個“s”字母

-q --quiet:安靜模式,不輸出任何匹配結果;

--color=auto:

-E:擴展的正則表達式,grep -E相當于egrep

-F --fixed-strings:grep -F相當于fgrep

-G --basic-regexp:基本的正則表達式?

????egrep -G相當于grep

????fgrep -G相當于grep

-P per1-regexp:使用PCRE引擎;

-A --after-context=NUM:在顯示PATTERN的同時顯示其后面NUM行;

????????創建文件a,包含以下內容????????????]$?cat?adasdaefafaewaagaergaergaergaergaergaergaergaeg?????????]$?cat?a?|grep-A?2?"aa"

???匹配結果:

????aa

????gaergaerg

????aerg

????顯示匹配到的內容,并顯示其后頭的兩行

-B --before-context=NUM:在顯示PATTERN的同時顯示其前面NUM行;

?????????]$?cat?a?|grep-B?2?"aa"

????efaf

????aew

????aa?

????顯示匹配到的內容,并顯示其前頭的兩行

-C --context=NUM:在顯示PATTERN的同時顯示其前后NUM行;

?????????????????]$?cat?a?|grep?-C?2?"aa"

??????匹配結果:??

????????efaf

????????aew

????????aa

????????gaergaerg

????????aerg

????顯示匹配到的內容,并顯示其前頭和后頭的兩行

PATTERN是過濾條件,是由正則表達式的元字符以及沒有特殊含義的文本字符組成。正則表達式的元字符會被正則表達式的引擎解釋為特殊含義。pcre——perl語言的正則表達式引擎是現在公認最完整的引擎。由一些正則表達式的元字符組成。比如:

? 字符匹配:

? ? .:匹配任意單個字符;

????????????]$?cat?a?|grep?"."

??????匹配結果:

????????dasda

????????efaf

????????aew

????????aa

????????gaergaerg

????????aerg

????????aergaerg

????????aer

????????ga

????????ergaeg

? ? []:匹配范圍內的任意單個字符;? ?

????????????]$?echo?abcde?|?grep?"[ace]"

????匹配結果:

????????abcde

? ? [^]:匹配指定范圍以外的人以單個字符;

??????]$?echo?abcde?|?grep?"[^ace]"

????匹配結果:

????????abcde

? 下列所有字符集都可以放于[]中用于匹配單個字符;

? ?[:lower:]:小寫字母

????????????]$?echo?1a2D?|grep?"[[:lower:]]"

????匹配結果:

????????1a2D

? ?[:upper:]:大寫字母

????????????]$?echo?1a2D?|grep?"[[:upper:]]"

????匹配結果:

????????1a2D

? ?[:alpha:]:所有字母,同于[:lower:]和[:upper:]的組合

????????????]$?echo?1a2D?|grep?"[[:alpha:]]"

????匹配結果:

????????1a2D

? ?[:digit:]:數字0-9:0 1 2 3 4 5 6 7 8 9

????????????]$?echo?1a2D?|grep?"[[:digit:]]"

????匹配結果:

????????1a2D

? ?[:space:]:空格和制表符

匹配空白和制表符

? ?[:alnum:]:字母與數字,同于[:alpha:]和[:digit:]的組合

????????????]$?echo?1a2D?|grep?"[[:alnum:]]"

????匹配結果:

????????1a2D

? ?[:punct:]:特殊字符如:! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _ ` ?~

????????????]$?echo?'1a2D?!@#'?|grep"[[:punct:]]"(因為有特殊字符,所以使用強引用單引號將特殊字符變為普通字符)

????匹配結果:

????????1a2D?!@#

? ?[:blank:]:空白

? ?[:xdigit:]:所有的十六進制數字:0 1 2 3 4 5 6 7 8 9 A B C D E F a b c d e f

????????????]$?echo?'1a2D?!@#'?|grep"[[:xdigit:]]"

????匹配結果:

????????1a2D?!@#

? ?a-z:所有的小寫字母;

????????????]$?echo?'1a2D?!@#'?|grep?"[a-z]"

????匹配結果:

????????1a2D?!@#


? ?A-Z:所有的大寫字母

????????????]$?echo?'1a2D?!@#'?|grep?"[A-Z]"

????匹配結果:

????????1a2D?!@#

? ?0-9:標識所有十進制數字;

????????????]$?echo?'1a2D?!@#'?|grep?"[0-9]"

????匹配結果:

????????1a2D?!@#

? 次數匹配:該類字符之前的那個字符可以出現的次數;

????????????]$?cat?a?|?grep?"[[:alpha:]]*"

????匹配結果:

????????Dasda

?????????

????????Efaf

? ?*:其前面的字符可以出現任意次;(0次,1次或多次)

? ?\?:其前面的字符可有可無(0次或1次)

? ?\+:其前面的字符至少出現一次(1次或多次)

? ?\{m\}:起前面的字符必須出現m次;

????????????]$?echo?"aaaa"?|grep"a\{3\}"

????匹配結果:

????????aaaa

? ?\{m,n\}:其前面的字符至少出現m次,至多出現n次;

? ?\{,n\}:其前面的字符至少出現0次,至多出現n次;

? ?\{m,\}:其前面的字符至少出現m次,×××;

? 組合起來的例子:

? ?.*:任意字符出現任意多次

? 位置錨定字符:

? ?行錨定:

? ? 行首錨定:^

????????????]$?cat?adasdaefafaewaagaergaerggaergaeg????????????]$?cat?a?|?grep?"^a"

????匹配結果:

????????aew

????????aa

????????匹配以a開頭的行

? ? 行尾錨定:$

????????????]$?cat?a?????????dasdaefafaewaagaergaerggaergaeg????????????]$?cat?a?|?grep?"g$"

????匹配結果:

????????gaergaerg

????????ergaeg

? ?字錨定:

? ? 字首錨定:\<或\b

????????????]$?echo?"as?is?da"?|?grep"\<a"

????匹配結果:

????????asis da

????????匹配以a字母開頭的字符串

? ? 字尾錨定:\>或\b

? ? \b:舊版本,不建議使用,因為有的時候會出問題,比如說前錨定和后錨定就不好區分

????????????]$?echo?"as?is?da"?|?grep"s\>"

????匹配結果:

????????????as is da

????????匹配以s字母結尾的字符串

在有一些情況下,我們可能需要一種例如匹配開頭和結尾一樣的字符串,如果僅僅使用上面的方法很難做到,所以現在有了分組和替換這個好東西。在進行匹配的時候,我們可以將一個前頭匹配到的東西進行標記,然后在后邊進行引用。具體的方法如下:

? ? \(PATTERN\):把PATTERN所匹配到的字符當作一個整體處理

? ? 在一串的匹配元字符中,從左往右數,第幾個“(”所包含的內容就是幾,在后頭可以使用\1,\2,\3...來進行引用。

? ? PATTERN1\(pattern2\)pattern3\(pattern4\(pattern5\)\)

? ? \1:pattern2

? ? \2:pattern4 \(pattern5\)

? ? \3:pattern5

在了解了分類之后,我們就可以使用它來進行實際的操作,例如:找到/etc/passwd中的uid與gid相同的行

????????grep?'\(\<[[:digit:]]\+\>\).*\1'?/etc/passwd

在匹配的時候我們還有可能用到或,例如匹配12或34,那么就需要用到“\|”這個符號了,但是請注意,這個符號會把兩邊的字符串當成一個整體,有的時候我們可能想寫分別以大小寫開頭的例如:A\|american,但是這個方法是錯誤的,他會輸出A或american,這個問題可以有兩種方法來解決,一種是(A\|a)merican,第二種是將所有的都寫出來:American\|american

接下來舉個例子:

???請找出ifconfig命令的執行結果中數值在100~255之間的整數;第一位:1????2第二位:0~9??0~4?5第三位:0~9??0~9?0~5

答案:

????????????ifcanfig|grep?'\<\(1[0-9][0-9]\|2[0-4][0-9]\|25[0-5]\)\>'

?grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]

?默認情況下,grep命令后面只允許有一個pattern,但是有的時候我們需要像或一樣匹配多個我們想匹配的東西,那么此時需要使用-e選項,每個-e選項后頭可以跟一個pattern作為參數。這樣我們就可以同時匹配到不同的東西。為了方便,我們還可以將所需要的pattern寫入到一個文件中,保證每行只有一個pattern,我們就可以使用grep -f file方式來實現多pattern匹配。

egrep和fgrep可以算是grep的衍生版,當grep加上一些特殊命令就變成了egrep和fgrep。egrep就是grep加上-E選項,它的作用就是使后頭的匹配參數不需要轉義即可生效,既可以使用基本的正則表達, 還可以用擴展表達式。而fgrep相當于grep加上-F選項,pattern中所有的字符都被當作文本字符來處理。

轉載于:https://blog.51cto.com/11142243/1917250

總結

以上是生活随笔為你收集整理的正则表达式选项分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。