16.正則表達式(快樂的Linux命令行)

1.知識點

知識點1:grep 參數

-i 忽略大小寫。也可用--ignore-case 來指定。
-v 打印不不匹配,這個選項導致 grep 程序只會打印不包含匹配項的文本行。也可用--invert-match 來指定。
-c 打印匹配的數量,也可用 --count 選項來指定。
-l 打印包含匹配項的文件名,而不是匹配項本身,也可用--files-with-matches 選項來指定。
-L 相似於-l 選項,打印匹配項本身,而不加文件名。也可用--files-without-match 來指定。
-n 在每個匹配行之前打印出其位於文件中的相應行號。也可用--line-number 選項來指定。
-h 應用於多文件搜索,不輸出文件名。也可用--no-filename 選項來指定。
-E 可以使用擴展正則表達式

對於指令,更重要的是記住有這麼一個功能,知道之後就可以通過查詢手冊進行敲打,熟練了自然會了。

知識點2:^A和[^A]之間的區別?

答:第一個是以A開頭,第二個是非的意思。

知識點3: POSIX 字符集包括哪些?

字符集 說明
[:alnum:] 字母數字字符。等價於:[A-Za-z0-9]
[:word:] 與[:alnum:]相同, 但增加了下劃線字符。
[:alpha:] 字母字符。等價於:[A-Za-z]
[:blank:] 包含空格和 tab 字符。
[:cntrl:] ASCII 的控制碼。包含了0到31,和127的 ASCII 字符。
[:digit:] 數字0到9
[:graph:] 可視字符。在 ASCII 中,它包含33到126的字符。
[:lower:] 小寫字母。
[:punct:] 標點符號字符。在 ASCII 中,等價於:[-!"#$%&'()*+,./:;<=>?@[\\\]_`{|}~]
[:print:] 可打印的字符。在[:graph:]中的所有字符,再加上空格字符。
[:space:] 空白字符,包括空格、tab、回車、換行、vertical tab 和 form feed.在 ASCII 中, 等價於:[ \t\r\n\v\f]
[:upper:] 大寫字母
[:xdigit:] 用來表示十六進制數字的字符。在 ASCII 中,等價於:[0-9A-Fa-f]

4.匹配元素個數的符號意義?

?

匹配零個或一個元素,使前面的元素可有可無。
* 匹配0個或多個元素,即任意多個。

匹配一個或多個元素,即至少一個。

{ } 

匹配特定個數的元素,即指定。比如{n},{n,m},{n,},{,m}。

2.代碼實操

grep [options] regex [file...]
[me@linuxbox ~]$ grep bzip dirlist*.txt
dirlist-bin.txt:bzip2
dirlist-bin.txt:bzip2recover
注:可以把bzip看成regex所需的參數。

[me@linuxbox ~]$ grep -l bzip dirlist*.txt
dirlist-bin.txt
[me@linuxbox ~]$ grep -L bzip dirlist*.txt
dirlist-sbin.txt
dirlist-usr-bin.txt
dirlist-usr-sbin.txt

[me@linuxbox ~]$ grep -h '.zip' dirlist*.txt
bunzip2
bzip2
bzip2recover
注意:圓點字符會增加一個字符,所以不會匹配到zip,zip是三個字符。

[me@linuxbox ~]$ grep -h '^zip' dirlist*.txt
zip
zipcloak
[me@linuxbox ~]$ grep -h 'zip$' dirlist*.txt
gunzip
gzip
[me@linuxbox ~]$ grep -h '[bg]zip' dirlist*.txt
bzip2
bzip2recover

[me@linuxbox ~]$ grep -h '[^bg]zip' dirlist*.txt
bunzip2
gunzip
注:是zip的前面是非b或g,而不是首字母。

[me@linuxbox ~]$ grep -h '^[A-Z]' dirlist*.txt
MAKEDEV
ControlPanel
GET
[me@linuxbox ~]$ grep -h '^[A-Za-z0-9]' dirlist*.txt
注:第一個匹配以大寫字母爲開頭,第二個在A-Z和a-z之間有and就好理解了。

[me@linuxbox ~]$ grep -h '[-AZ]' dirlist*.txt
注:這個就是匹配包含-或A或Z,-失去了連字符的意義。

[me@linuxbox ~]$ ls /usr/sbin/[[:upper:]]*
/usr/sbin/MAKEFLOPPIES
/usr/sbin/NetworkManagerDispatcher
/usr/sbin/NetworkManager

[me@linuxbox ~]$ echo "AAA" | grep AAA
AAA
[me@linuxbox ~]$ echo "BBB" | grep AAA
[me@linuxbox ~]$ echo "AAA" | grep -E 'AAA|BBB'
AAA
[me@linuxbox ~]$ echo "BBB" | grep -E 'AAA|BBB'
BBB
[me@linuxbox ~]$ echo "CCC" | grep -E 'AAA|BBB'

[me@linuxbox ~]$ grep -Eh '^(bz|gz|zip)' dirlist*.txt
[me@linuxbox ~]$ grep -Eh '^bz|gz|zip' dirlist*.txt
注:第一個以“bz”,或“gz”,或“zip”開頭的文件名。第二個匹配任意以“bz”開頭,或包含“gz”,或包
含“zip”的文件名。

[me@linuxbox ~]$ echo "(555) 123-4567" | grep -E '^\(?[0-9][0-9][0-9]\)? [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]$'
(555) 123-4567
[me@linuxbox ~]$ echo "555 123-4567" | grep -E '^\(?[0-9][0-9][0-9]\)? [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]$'
555 123-4567
[me@linuxbox ~]$ echo "AAA 123-4567" | grep -E '^\(?[0-9][0-9][0-9]\)? [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]$'
注:表達式匹配這個電話號碼的兩種形式,但是不匹配包含非數字字符的號碼。^\(?意義者前面的(可有可無

[me@linuxbox ~]$ echo "This works." | grep -E '[[:upper:]][[:upper:][:lower:] ]*\.'
This works.
[me@linuxbox ~]$ echo "This Works." | grep -E '[[:upper:]][[:upper:][:lower:] ]*\.'
This Works.
[me@linuxbox ~]$ echo "this does not" | grep -E '[[:upper:]][[:upper:][:lower:] ]*\.'

[me@linuxbox ~]$ echo "This that" | grep -E '^([[:alpha:]]+ ?)+$'
This that
[me@linuxbox ~]$ echo "a b c" | grep -E '^([[:alpha:]]+ ?)+$'
a b c
[me@linuxbox ~]$ echo "a b 9" | grep -E '^([[:alpha:]]+ ?)+$'
[me@linuxbox ~]$ echo "abc  d" | grep -E '^([[:alpha:]]+ ?)+$'
注:[[:alpha:]]+是至少一個[a-zA-Z],空格?是0個或多個空格。^([[:alpha:]]+ ?)+$整體的意思就是可
以匹配A或A空格。

[me@linuxbox ~]$ echo "(555) 123-4567" | grep -E '^\(?[0-9]{3}\)? [0-9]{3}-[0-9]{4}$'
(555) 123-4567
[me@linuxbox ~]$ echo "555 123-4567" | grep -E '^\(?[0-9]{3}\)? [0-9]{3}-[0-9]{4}$'
555 123-4567
[me@linuxbox ~]$ echo "5555 123-4567" | grep -E '^\(?[0-9]{3}\)? [0-9]{3}-[0-9]{4}$'

案例:電話簿操作
[me@linuxbox ~]$ for i in {1..10}; do echo "(${RANDOM:0:3}) ${RANDOM:0:3}-${RANDOM:0:4}" >> phonelist.txt; done
[me@linuxbox ~]$ cat phonelist.txt
(232) 298-2265
(624) 381-1078
(540) 126-1980
(874) 163-2885
(286) 254-2860
(292) 108-518
(129) 44-1379
(458) 273-1642
(686) 299-8268
(198) 307-2440
[me@linuxbox ~]$ grep -Ev '^\([0-9]{3}\) [0-9]{3}-[0-9]{4}$'    phonelist.txt
(292) 108-518
(129) 44-1379

[me@linuxbox ~]$ find . -regex '.*[^-\_./0-9a-zA-Z].*'
注:掃描會發現包含空格和其它潛在不規範字符的路徑名

[me@linuxbox ~]$ locate --regex 'bin/(bz|gz|zip)'
/bin/bzcat
發佈了59 篇原創文章 · 獲贊 11 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章