正则表达式
相信只要接触过一种语言 不管是什么语言,那么都会或多或少的接触使用过正则表达式,我的理解就是正则表达式是能够表达特定格式的特殊的字符串。
语系对正则表达式的影响。 LANG=C 时,编码顺序是1,2,3.....A,B,C,D.....Z,a,b,c,d....z 当LANG=zh_CN时,编码顺序为1,2,3.....A,a,B,b,C,c....Z,z相信你已经看出来区别了, 之前我们说过LANG 是环境变量 要查看很简单 , echo $LANG 就行了,要改变 直接LANG=C就ok
特殊符号 | 代表意义 |
[:alnum:] | 代表英文大小写字母及数字,即 0-9,A-Z,a-z |
[:alpha:] | 代表任何英文字母, 即 A-Z,a-z |
[:blank:] | 代表键盘上tab键 |
[:digit:] | 代表数字,即0-9 |
[:grapha:] | 除空格和tab键外的其他按键字符 |
[:lower:] | 代表任何小写字母 |
[:print:] | 代表任何可被打印出来的字符 |
[:punct:] | 代表标点字符 即:" ' ? ! ; # $ |
[:upper:] | 代表任何大写字母 |
[:space:] | 代表任何可以产生空格的字符包括 tab 和CR等 |
[:xdigit:] | 代表十六进制的数字类型, 因此它是 0-9,A-F,a-f |
[:cntrl:] | 代表键盘上的控制字符 , 包括 CR, LF , Tab, Del等 |
上面的表 听说在正则表达式中 和99乘法表在数学中拥有同样地位的东西, 需要死记硬背下来的 其实很简单的。
因为Linux中的很多工具都是可以使用正则表达式的, 所以我们需要在平常的工作学习中 多用正则表达式, 学过程序的同学应该都知道正则表达式在程序中占有怎样的位置的。
拿grep命令来说, 我用的最多的就是和find命令的组合使用, 因为经常需要查找某个字符串在那些文件中有, 这样写的 find -name *.java -exec grep -Hn "Hello world" {} \;
后面的“{} \;”是一种格式, 我到现在都不知道为什么要那些东西, 不过不用的话这条命令都是错的,
grep [-A] [-B] [-iHn] [--color=auto] "搜索的字符串" filename
-A 表示after 意思是 出去查找到的行把它之后的几行也列出来
-B 表示 befer 意思是 除去查找到的行,把它之前的几行也列出来
我的机子上默认查找到的东西是有颜色的, 这是为什么咧, alias | grep “grep” 就知道了 , 原来在~/.bashrc 中有这么一句话 alias grep = ‘grep --color=auto’ 如果你查找到的东西没有颜色,那么就在你的~/.bashrc中添加上, 然后 source ~/.baserc
------------------------------------------------------
这几天的练习我会使用鸟哥的一个资源 http://linux.vbird.org/linux_basic/0330regularex/regular_express.txt 直接下载
(再说一次我这个是边看鸟哥的书边在记笔记,可能和书上没区别的,如果想好好学呢 ,还是和我一样去买一本鸟哥吧)
我们还需要配置一下vim。 输入vim ~/.vimrc
在里面写入 set nu 回车 set hlsearch ,就够了, set nu表示显示行号, set hlsearch 表示高亮显示查找 , 如果需要取消 删掉 ~/.vimrc
1.一般查找 , 很简单 , 输入 grep -n “the” regular_express.txt 试试, 记得grep工具的 反向选择 -v就是不包含输入字符串的。-i 表示不区分大小写
2.现在来点简单的正则表达式练习, 查找 test 和 tast的行呢, 这里可以使用正则表达式了, 中括号里面的表示有且只有一个, 刚才那个就是 grep -n "t[ea]st" regular_express.txt . 如果是test前没有a呢 ,需要使用 ^ 这个符号了, 就是 grep -n "[^a]test" regular_express.txt 如果要查找 test 但是要求他前面不能有大写字母该怎么办嫩, 如果是在LANG=C下面呢可以这样 grep -n "[^A-Z]test" regular_express.txt. 如果实在LANG=zh_CN下就不能这样了 , 因为A-Z 也包括了小写字母这里就可以使用刚才说的必须背的东西了 grep -n “[^[:upper:]]test” regular_express.txt 这样的命令呢可以直接不考虑语言环境的使用 是不是很爽阿,
上面有两个符号 “-” "^" 横杠表示连续的编码字符,比如 a-z表示a到z的所有小写字母 当然这个要看语系的, “^” 表示非, 就是相反的意思拉,这里个符号在中括好里面是这个意思拉, 出了中括号就不知道了。
3. 行首与行尾符 “^$”,^出了中括号就表示成行首了, 如果我要查找以a开头的行,就是 grep -n "^a" regular_express.txt "鸟哥还喜欢吃苹果。。 我以为鸟哥都不食人间烟火了呢" 行尾符就是 “$” , 查找以a结尾的行呢。 这里注意了是 grep -n "a$" regular_express.txt 。。a在前面, 刚才我以为是$a自以为正确 结果输入进去全都出来了,去,,!
这里要注意了,在 MS下面的换行符是“^M$”, 而Linux的换行符是“$” , 空白行怎么找呢 一行里面只有行首和行尾 就是空白行了 “^$” . grep -v 反向选择很有用的哦
4.任意一个字符 . , 和重复字符* ,这里的*有点难以理解,表示的是重复0个或多个前面的RE字符, o* 表示的是 具有空字符或一个o以上的字符, 如果你要查找至少两个oo应该是 ooo*, 记住*只是前面一个符号 所以 ooo* 应该这样看 oo+o* 就是oo后面接了0个或多个o, (搞半天呢。。。)