正则表达式初步

正则表达式:描述具有某种特征的字符串的表达式。

正则表达式由普通字符与特殊字符(元字符)组成。

基本元字符集

^ 在每行的开始进行匹配
$ 在每行的末尾进行匹配
\< 在单词的开始进行匹配
\> 在单词的末尾进行匹配
. 对单个字符进行匹配
[str] 对str中的任意单个字符进行匹配
[^str] 对任意不在str中的单个字符进行匹配
[a-b] 对a到b之间的任何字符进行匹配
\ 抑止后面的一个字符的特殊含义
* 对前一项(item)进行0次或多次重复匹配


grep命令示例

grep ^public t1.txt 

查找t1文件中行首包含public的行。

grep public$ t1.txt

查找t1文件中行尾包含public的行。

grep -n ^$ t1.txt 

查找t1文件中的空行。n表示打印的行数。
grep -n ^.$ t1.txt

查找只包含一个字符的行。
grep -n \<public t1.txt 

 被解析为 grep -n <public t1.txt(无效)
grep -n ‘\<public’ t1.txt

查找单词开头部分出现public的行。加‘’ 抑制shell对特殊字符的解析。
grep -n ‘public\>’ t1.txt

查找单词结尾部分出现public的行。

grep -n 11[MNX] t1.txt

查找包含字符 11M 或 11N 或 11X的行。

grep -n 11[^MNX] t1.txt

查找包含字符 11 且不包含字符11M 或 11N 或 11X的行 。

grep -n “\\” t1.txt

查找不到。关于“”只能抑制shell对部分字符的解析(如() []),不能抑制 \。所以shell接收\\ ,解析成 \,会把\传给grep.

grep -n “\\\\” t1.txt

查找包含 \ 的行
grep -n ‘\\’ t1.txt

查找包含 \ 的行

grep -n go*d t1.txt

查找包含g(0到n个o)d的行。如gd,god,good,goood……

grep -ni public t1.txt

查找包含public的行,不区分大小写。



扩展元字符集

对前一项进行1次或多次重复匹配 
对前一项进行0次或1次重复匹配 
{j}  对前一项进行j次重复匹配 
{j,}  对前一项进行j次或更多次重复匹配 
{,k}  对前一项最多进行k次重复匹配 
{j,k}  对前一项进行j到k次重复匹配 
s|t  匹配s项或t项中的一项 
(exp)  将exp作为单项处理 


grep -E go+d t1.txt

查找一个或多个o。-E表示为扩展字符集。(或者egrep -n …效果一样的)

grep -En 10{3}A t1.txt

对0进行3次重复匹配,查找1000A所在的行。

grep -En 10\{2,4\}A t1.txt  

grep -En ‘10{2,4}A‘ t1.txt  

grep -En “10{2,4}A” t1.txt  

三个效果一样,查找2到4个0的行。 100A, 1000A, 10000A。
grep -En '11A|B' t1.txt

匹配11A或11B的行。 |对shell来说是管道,印制特殊含义。
grep -En net\(works\)* t1.txt

匹配0个或多个works. 括号内当作一项。


查询多个文件,可以使用通配符 *

grep -n test *.txt

查找包含test字符的所有文件的所在行。

grep -ln test *.txt

只列出哪些文件包含test. n不在起作用。如果一个文件多处包含,文件也只匹配一次。

反向匹配 -v

ps aux| grep "ssh" | grep -v "grep"

查找包含ssh的进程,且不包含grep进程。

递归搜索目录中的所有文件:-r

grep -rn telnet/etc

查找etc文件及子目录文件下包含telnet的行。


 正则表达式在vi中的使用例子

在当前行中删除从aa到zz的所有字符。
:s/aa.*zz//
在整个文件用and代替所有的&字符。
:1,$s/&/and/
在每一行的行首插入字符串new
:1,$s/^/new/
在第2行到第5行的行尾插入字符串@@
:2,5s/$/@@/g
去掉行首的所有数字字符
:s/^[0-9][0-9]*//

s表示替换。1,$表示整个文件。


稍复杂的例子

foo(10,7,2) 替换为 foo(7,10,2) 
foo(x+13,y-2,10) 替换为 foo(y-2,x+13,10) 
foo( bar(8), x+y+z, 5) 替换为 foo( x+y+z, bar(8), 5)
:1,$s/foo(\([^,]*\),\([^,]*\),\([^)]*\))/foo(\2,\1,\3)/g
[^,]   除了逗号之外的任何字符 
[^,]*  0或者多个非逗号字符 
\([^,]*\)  将这些非逗号字符标记为\1,这样可以在之后的替换模式表达式中引用它 
\([^,]*\),  我们必须找到0或者多个非逗号字符后面跟着一个逗号,并且非逗号字符那部分要标记出来以备后用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值