12.26&12.27 -正则表达式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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结尾的行     ---- 并且

[[email protected] oldboy]# grep '^m.*m$' oldboy.txt

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

 

 

3.0.7 \  撬棍   转义字符   脱掉马甲打回原形

找出文件中以.结尾的行

[[email protected] log]# grep '\.$' /oldboy/oldboy.txt

I teach linux.

not 4900000448.

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

                2.一对一替换

   特点         3.无法直接读取文件内容 接 <

\n    =====回车

例:把文件中的空格替换为回车    

[[email protected] oldboy]# tr '\n' ' ' oldboy.txt       回车替换为空格

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

Try `tr --help' for more information.      必须加<输入重定向符号

[[email protected] 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 阉割版

[[email protected] oldboy]# echo 123123|tr '123' 'abc'

abcabc

一对一替换

[[email protected] oldboy]# echo 12332|tr '123' 'abc'

abccb

3.0.8 [ ]    [abc] 找出包含abc的行   []字符内没有特殊含义

                                单个字符分割,以连接

找出以小写字母开头并以.或!结尾的行

[[email protected] oldboy]# grep '^[a-z].*[.!]$' oldboy.txt

not 4900000448.

my god ,i am not oldbey,but OLDBOY!

 

3.0.9 [^]   排除,相当于是一个符号(每次匹配一个字符)  排除a或bc   

找出文件中不是以m或n开头的行

[[email protected] 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

[[email protected] 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

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

 610702199107053598

邹 371481199403259478

 

4.0.2  |   或者

找出3306或1521端口服务

[[email protected] 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 ()   表示一个整体   反/后向引用

找出文件中包含oldboy或oldbey的行

[[email protected] 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         这个就叫后向引用

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

12<34>56                          \2对应前面第几个

12.27

4.0.5 {}   0{n,m} 前一个字符至少连续出现了n次,最多连续出现了m

0{n,m}  前一个字符至少连续出现n次,最多连续出现了m

0{n}   前一个字符连续出现n

0{n,}   前一个字符至少连续出现n

0{,m}  前一个字符最多连续出现了m

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

[[email protected] oldboy]# egrep '0{3,4}' oldboy.txt  

my qq is 49000448

not 4900000448.

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

[[email protected] oldboy]# egrep '0{3}' oldboy.txt  

my qq is 49000448

not 4900000448.

 

 

找出0连续出现了三次的行(正好三次)

[[email protected] oldboy]# egrep '^.*[^0]0{3}[^0].*$' oldboy.txt 

my qq is 49000448

 

错误:加号在花括号前面,花括号失效

技术分享图片 

 

4.0.6 ?前一个字符出现零次或一次

[[email protected] oldboy]# cat good.txt

good

gd

god

goood

[[email protected] oldboy]# egrep 'go?d' good.txt

gd

god

 

4.1 ERE小结

1. +一般与[]进行配合 把各种连续的东西取出来

2. |   或

3. ()  一个整体   后向引用---sed

4. {}   0{n,m} 前一个字符至少连续出现了n次,最多连续出现了m

5. ?  前一个字符出现了零次或一次

 

4.2 基础正则与扩展正则的区别

基础正则:   grep/sed/awk

扩展正则:  egrep/sed -r/awk

 

4.3 grep/sed 可以加\转义符号识别扩展正则

[[email protected] 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 -正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

12.26~12.30工作日志

12.27

日记12.27/题解CF Edu79

上周热点回顾(12.27-1.2)

12.20-12.26博客精彩回顾

linux常用命令总结(12.26)