正则表达式:描述具有某种特征的字符串的表达式。
正则表达式由普通字符与特殊字符(元字符)组成。
基本元字符集
^ 在每行的开始进行匹配
$ 在每行的末尾进行匹配
\< 在单词的开始进行匹配
\> 在单词的末尾进行匹配
. 对单个字符进行匹配
[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作为单项处理
查找一个或多个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或者多个非逗号字符后面跟着一个逗号,并且非逗号字符那部分要标记出来以备后用。