1. 程式人生 > >12.26&12.27- 正則表達式

12.26&12.27- 正則表達式

正則

12.26&12.27

正則表達式

第1章 使grep/egrep 過濾出的東西加上顏色

cat >>/etc/profile<<EOF

alias grep='grep --color=auto'

alias egrep='egrep --color=auto'

EOF

source /etc/profile

alias grep egrep

第2章 正則表達式分類

2.1 基礎正則表達式:basic regular expression BRE

^ $ . * [] [^] \

2.2 擴展正則表達式:extended regular expression ERE

| + () {} ?

2.3 正則與通配符區別:

作用 支持的命令

通配符: 查找文件名 Linux大部分命令都支持 以.txt結尾的文件

正則: 在文件中過濾內容 sed,grep,awk Python Java

2.4 使用正則表達式註意事項

1.正則表達式按照行為單位處理

2.正則神坑-中文符號

‘’ “” () 。 * …… ¥ | {} 【】

'' "" () . * ^

$ | {} []

3.區分大小寫

環境

cat oldboy.txt

I am oldboy teacher!

I teach linux.

I like badminton ball ,billiard ball and chinese chess!

my blog is http://oldboy.blog.51cto.com

our size is http://blog.oldboyedu.com

my qq is 49000448

not 4900000448.

my god ,i am not oldbey,but OLDBOY!

第3章 基礎正則(BRE

3.0.1 ^ 以……開頭的行

grep

^m /oldboy.txt 以m開頭的行

3.0.2 $ 以……結尾的行

grep ‘m$’ /oldboy.txt

神坑:::::有的行結尾有時候會多個空格

cat -A 顯示出文件中的特殊標記 行尾 $標記

3.0.3 ^$ 空行 什麽都沒有(包括空格也沒有)

grep -v '^$' oldboy.txt 排除文件中的空行

grep -n 顯示行號

3.0.4 . 任意一個字符 不會匹配空行

grep ‘.’ oldboy.txt

grep -o 顯示命令執行過程,顯示grep命令每一次找到了什麽

技術分享圖片 空格也執行一次命令

3.0.5 * 前一個字符連續出現了0次或0次以上

grep ‘0*’ oldboy.txt

技術分享圖片

坑:過濾的目標出現了0次的時候,會顯示整個文件的內容

3.0.6 .* 所有 任何符號 包含空行

貪婪性 ( . * .* + ? )

1. .*所有符號 任何符號 連續出現的字符 有多少匹配多少

2. 正則表達 所有符號 連續出現 會表現出貪婪性

3. 匹配到最後一個符合的條件---------貪婪性

技術分享圖片

找出以m開頭並以m結尾的行 ---- 並且

[root@oldboy oldboy]# grep '^m.*m$' oldboy.txt

my blog is http://oldboy.blog.51cto.com

3.0.7 \ 撬棍 轉義字符 脫掉馬甲打回原形

找出文件中以.結尾的行

[root@oldboy log]# grep '\.$' /oldboy/oldboy.txt

I teach linux.

not 4900000448.

tr命令 1.不能直接修改文件內容

2.一對一替換

特點 3.無法直接讀取文件內容 接 <

\n =====回車

例:把文件中的空格替換為回車

[root@oldboy oldboy]# tr '\n' ' ' oldboy.txt 回車替換為空格

tr: extra operand `oldboy.txt' tr不能直接讀取文件

Try `tr --help' for more information. 必須加<輸入重定向符號

[root@oldboy oldboy]# tr '\n' ' ' <oldboy.txt

I am oldboy teacher! I teach linux. I like badminton ball ,billiard ball and chinese chess! my blog is http://oldboy.blog.51cto.com our size is http://blog.oldboyedu.com my qq is 49000448 not 4900000448. my god ,i am not oldbey,but OLDBOY!

報錯:tr命令無法直接讀取文件 必須加< 不能修改文件內容

替換:把123替換為abc sed 閹割版

[root@oldboy oldboy]# echo 123123|tr '123' 'abc'

abcabc

一對一替換

[root@oldboy oldboy]# echo 12332|tr '123' 'abc'

abccb

3.0.8 [ ] [abc] 找出包含abc的行 []字符內沒有特殊含義

單個字符分割,連接

找出以小寫字母開頭並以.或!結尾的行

[root@oldboy oldboy]# grep '^[a-z].*[.!]$' oldboy.txt

not 4900000448.

my god ,i am not oldbey,but OLDBOY!

3.0.9 [^] 排除,相當於是一個符號(每次匹配一個字符) 排除abc

找出文件中不是以mn開頭的行

[root@oldboy oldboy]# grep '^[^mn]' oldboy.txt

I am oldboy teacher!

I teach linux.

I like badminton ball ,billiard ball and chinese chess!

our size is http://blog.oldboyedu.com

grep/egrep [a-Z]

第4章 擴展正則(ERE

4.0.1 + 前一個字符連續出現一次或多次

grep -E ===egrep

[root@oldboy log]# egrep '0+' /oldboy/oldboy.txt

my qq is 49000448

not 4900000448.

+小結:

1.前一個字符連續出現1次或一次以上

2.+一般與[]進行配合

例題:

lidao.×××

cat id.txt

610702199107053598

371481199403259478

52020319810613433X

460106199111137270

530124197504135438

oldboy

babygirl

530124197504135438

360702197902169951

331002198504132813

621223198708245176

370602198507189574

320904198403048179

如何判斷用戶的×××號碼是否正確?

特殊符號幫助我們處理文件====正則表達式

在文件中過濾出你想要的或不想要的內容

解答: egrep '[0-9X]+' id.txt

[root@oldboy log]# egrep '[0-9X]+' /oldboy/id.txt

610702199107053598

371481199403259478

4.0.2 | 或者

找出33061521端口服務

[root@oldboy log]# egrep '3306|1521' /etc/services

mysql 3306/tcp # MySQL

mysql 3306/udp # MySQL

ncube-lm 1521/tcp # nCube License Manager

ncube-lm 1521/udp # nCube License Manager

4.0.3 () 表示一個整體 /後向引用

找出文件中包含oldboyoldbey的行

[root@oldboy log]# egrep 'oldb(o|e)y' /oldboy/oldboy.txt

I am oldboy teacher!

my blog is http://oldboy.blog.51cto.com

our size is http://blog.oldboyedu.com

my god ,i am not oldbey,but OLDBOY!

4.0.4 ( ) 反向引用/後向引用----sed 先保護在使用

sed -r 識別擴展正則

使輸出結果為 12<34>56 這個就叫後向引用

[root@oldboy oldboy]# echo 123456 |sed -r 's#(12)(34)(56)#\1<\2>\3#g'

12<34>56 \2對應前面第幾個

12.27

4.0.5 {} 0{nm} 前一個字符至少連續出現了n次,最多連續出現了m

0{n,m} 前一個字符至少連續出現n次,最多連續出現了m

0{n} 前一個字符連續出現n

0{n,} 前一個字符至少連續出現n

0{,m} 前一個字符最多連續出現了m

:查找文本中0最少出現3次最多出現4次的行

[root@oldboy oldboy]# egrep '0{3,4}' oldboy.txt

my qq is 49000448

not 4900000448.

:查找文本中0出現3次的行

[root@oldboy oldboy]# egrep '0{3}' oldboy.txt

my qq is 49000448

not 4900000448.

找出0連續出現了三次的行(正好三次)

[root@oldboy oldboy]# egrep '^.*[^0]0{3}[^0].*$' oldboy.txt

my qq is 49000448

錯誤:加號在花括號前面,花括號失效

技術分享圖片

4.0.6 ?前一個字符出現零次或一次

[root@oldboy oldboy]# cat good.txt

good

gd

god

goood

[root@oldboy oldboy]# egrep 'go?d' good.txt

gd

god

4.1 ERE小結

1. +一般與[]進行配合 把各種連續的東西取出來

2. |

3. () 一個整體 後向引用---sed

4. {} 0{nm} 前一個字符至少連續出現了n次,最多連續出現了m

5. 前一個字符出現了零次或一次

4.2 基礎正則與擴展正則的區別

基礎正則: grep/sed/awk

擴展正則: egrep/sed -r/awk

4.3 grep/sed 可以加\轉義符號識別擴展正則

[root@oldboy oldboy]# grep 'go\+d' good.txt

good

god \只能轉義對單個字符 雞肋

goood

補充:了解

技術分享圖片

4.4 正則總結

1. grep/egrep -o和顏色是grep獨有

2. 一步步分解

4.5 正則學習資料

man grep

info sed/awk/grep

https://www.gnu.org/software/grep/manual/grep.html



12.26&12.27- 正則表達式