标签:
正则表达式(Regular Expression,常简写为regex、regexp或RE):又称正规表达式,正规表示法,正规表达式,规则表达式,常规表示法。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。
基本语法:一个正则表达式通常被称为一个模式(pattern),为用来描述或匹配一系列符合某个句法规则的字符串。
选择: | boy|girl 可以匹配boy或girl
数量限定:*、+、?、. 若在一个模式中不加数量限定符则表示出现一次且仅出现一次
+表示前面的字符必须出现至少一次或多次 如 goo+gle可以匹配goooogle,gooooooooooogle
?表示前面的字符最多出现零次或一次 如 colou?r可以匹配color,colour
*表示前面的字符可以不出现,也可出现一次或多次 如 0*45可以匹配42,042,0045等
范围和优先级:()用来定义模式字符串的范围和优先级,可以简单的理解为是否括号内的模式串作为一个整体。如 gr(e|a)y 等价于gray|grey, (grand)?father匹配father和grandfather。
正则表达式有多种不同的风格,下面列举一些常用的作为PCRE子集的适用用于perl和python变成语言及grep或egrep的正则表达式匹配规则
PCRE(Perl Compatible Regular Expressions:perl语言兼容正则表达式)是一个用C编写的正则表达式函数库,有Philop Hazel编写。PCRE是一个轻量级的函数库,比Boots值类的正则表达式库要小得多。
\ 讲一个字符标记为一个特殊字符、或一个原义字符
^ 匹配输入字符串的开始位置
$ 匹配输入字符串的结束位置
{n} n是一个非负整数。匹配确定的n次。 如o{2} 不能匹配bob 但是可以匹配food
{n,} n是一个非负整数。至少匹配n次。 如 o{2,}不能匹配bob,但是可以匹配fooood。 o{1,}等价于o+。o{0,}等价于o*
{n,m} m和n均为非负整数。其中n<=m。最少匹配n次且最多匹配m次。如 o{1,3}将匹配foooood中的前三个o o{0,1}等价于o?
* 匹配前面的表达式0次或多次
+ 匹配前面的表达式1次或多次
? 匹配前面的表达式0次或1次
? 当?字符紧跟在任何一个其他限制符(*,+,?,{n},{n,m})后面,匹配模式是非贪婪的。非贪婪模式尽可能烧的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。 o+?只匹配单个o 而o+将匹配所有o
. 匹配除\n之外的任何单个字符,若要包含\n,可以使用(.|\n)
(pattern) 匹配pattern并获取这一匹配的子字符串。该字符串用于向后引用。要批评圆括号字符,需使用\(或\)
x | y 匹配x或y 如 z | food 匹配z或food (z | f)oo可以匹配zoo或foo
[xyz] 字符集合(character class)。匹配所包含的任意一个字符。如 [abc]可以匹配plain中的a。其中特殊字符仅有反斜线\保持特殊含义,用于转义字符。其他特殊符如星号、加号、各种括号等均作为普通字符。脱字符^若出现在首位则表示负值字符集合;若出现在字符串中仅作为普通字符。连字符-若出现在字符串中表示字符范围描述;若出现在首位则仅作为普通字符。
[^xyz] 排除型(negate)字符集合。匹配未列出的任意字符。 如 [^abc]可以匹配plain中的plin
[a-z] 字符范围。匹配指定范围内的任意字符。
[^a-z] 排除型字符范围。匹配任何不在指定范围内的任意字符。
优先级:优先级从上到下,从左到右依次降低。
\ 转义符
(),(?:),(?=),[] 括号和中括号
*,+,?,{n},{n,},{n,m} 限定符
^,$,\任何元字符 定位点和序列
| 选择
grep模式匹配命令
grep用于打印输出文本中匹配的模式串,他是用正则表达式作为模拟匹配的条件。grep支持三种正则表达式引擎,分别用三个参数指定: -E:POSIX扩展正则表达式,ERE -G:POSIX基本正则表达式,BRE -P:Perl正则表达式,PCRE
grep常用参数:
-b 将二进制文件作为文本来进行匹配
-c 统计以模式匹配的数目
-i 忽略大小写
-n 显示匹配文本所在行的行号
-v 反选,输出不匹配行的内容
-r 递归匹配查找
-A n n为正整数。表示after。除了列出匹配行之外,还列出后面的n行
-B n n为正整数。表示before。除了列出匹配行之外,还列出前面的n行
--color=auto 将输出中的匹配项设置为自动颜色显示
$ touch test
$ vim test
//输入一系列字符后 命令行模式下:wq!保存并退出
$ cat test
$ grep -c hello test //在test中查找hello所有的行号
$ grep -i -n c test //在test中查询c所在的字符串并返回他所在的行数
$ grep -v shell test //在test中查找除shell外其他的字符串
$grep hello test //在test中查找hello所在的行的内容
使用正则表达式
$ grep ‘shiyanlou‘ /etc/group //在/etc/group中查找以shiyanlou开头的行
$ grep ‘^shiyanlou‘ /etc/group //在/etc/group中查找以shiyanlou开头的行
$ echo ‘zero\nzo\nzzo‘ | grep ‘z.*o‘ //在zero、nzo、nzzo中匹配以z开头以o结尾的所有字符串 其中的\n为换行
$ echo ‘zero\nzo\nzzo‘ | grep ‘z.o‘ //在zero、nzo、nzzo中匹配以z开头以o结尾,且中间包含一个任意字符串的字符串 其中的\n为换行
$ echo ‘zero\nzo\nzzo‘ | grep ‘zo*‘ //将匹配以z开头,以任意多个o结尾的字符串 其中的\n为换行
$ echo ‘1234\nabcd‘ | grep ‘[a-z]‘ // gerp默认是区分大小写的,这里匹配所有小写字母
$ echo ‘1234\nabcd‘ | grep ‘[0-9]‘ //匹配所有的数字
$ echo ‘1234\nabcd‘ | grep ‘[[:digit:]]‘ //匹配所有的数字
$ echo ‘1234\nabcd‘ | grep ‘[[:lower:]]‘ //匹配所有的小写字母
$ echo ‘1234\nabcd‘ | grep ‘[[:upper:]]‘ //匹配所有的大写字母
$ echo ‘1234\nabcd‘ | grep ‘[[:alnum:]]‘ //匹配所有的字母和数字,包括0-9 a-z A-Z
$ echo ‘1234\nabcd‘ | grep ‘[[:alpha:]]‘ //匹配所有的字母
$ echo ‘1234\nabcd‘ | grep ‘[[:blank:]]‘ //匹配所有空白键与Tab按键两者
$ echo ‘1234\nabcd‘ | grep ‘[[:cntrl:]]‘ //匹配键盘上的控制按键,亦包括CR LF Tab Del等
$ echo ‘1234\nabcd‘ | grep ‘[[:graph:]]‘ //匹配除了空白字节外的其他所有按键
$ echo ‘1234\nabcd‘ | grep ‘[[:print:]]‘ //匹配任何可以被列出来的字节
$ echo ‘1234\nabcd‘ | grep ‘[[:punct:]]‘ //匹配所有标点符号
$ echo ‘1234/nabcd‘ | grep ‘[[:xdigit:]]‘ //匹配所有16进制的数字类型
之所以要使用特殊符号,是因为上面的[a-z]不是在所有情况下都有效,这还与知己当前的语系有关,即设置在LANG环境变量的值。zh_CN.UTF-8的话,[a-z]即为所有的小写字母,其他语系可能是大小写交替。
$ echo ‘geek|good‘ | grep ‘[^o]‘ //排除o之外的字符
使用扩展正则表达式 grep -E 或 egrep
$ echo ‘zero\nzo\nzoo‘ | grep -E ‘zo{1}‘ //只匹配zo
$ echo ‘zero\nzo\nzoo‘ | grep -E ‘zo{1,}‘ //匹配以zo开头的所有单词
$ echo ‘www.baidu.com\nwww.shiyanlou.com\nwww.google.com‘ | grep -E ‘www\.(baidu|shiyanlou)\.com‘ \\匹配www.shiyanlou.com和ww.baidu.com
$ echo ‘www.shiyanlou.com\nwww.baidu.com\nwww.google.com‘ | grep -Ev ‘www\.baidu\.com‘ \\匹配不包含baidu的内容
sed流编辑器
sed工具在man手册里全名为sed-stream editor for filtering and transforming test(用于过滤和转换文本的流编辑器)。sed是一个非交互式的编辑器。sed命令的基本格式 sed [参数]... [执行命令] [输入文件]...
$ sed -i ‘1s/sad/happy‘ test #将test文件中第一行的sad替换为happy
sed常用参数 -n 安静模式。只打印受影响行。默认打印输入数据的全部内容 -e 用于在脚本中添加多个执行命令一次执行,在命令行中执行多个命令通常不需要添加该参数 -f filename 指定执行filename文件中的命令 -r 使用扩展正则表达式,默认为标准正则表达式 -i 将直接修改输入文件内容,而不是打印到标准输出设备
sed编辑器的执行命令的格式为 [n1] [,n2]command [n1][~step]command n1,n2表示输入内容的行号,他们之间的,表示从n1到n2行,若为~则表示从n1开始以step为步进的所有行。command为执行动作
$ sed -i ‘s/sad/happy/g‘ test #g表示全局范围
$ sed -i ‘s/sad/happy/4‘ test #4表示指定行中的第四个匹配字符串
sed常用参数 s 行内替换 c 正行替换 a 插入到指定行的后面 i 插入到指定行的前面 p 打印指定行 通常与-n参数配合使用 d 删除指定行
$ cp /etc/passwd ~
$ nl passwd | sed -n ‘2,5p‘ #打印2-5行
$ nl passwd | sed -n ‘1~2p‘ #打印奇数行
$ sed -n ‘s/shiyanlou/hehe/gp‘ passwd #将输入文本中shiyanlou全部替换为hehe,并只打印替换那一行
$ nl passwd | grep ‘shiyanlou‘
$ sed -n ‘21c\www.shiyanlou.com‘ passwd #删除第21行
awk文本处理语言
awk是一种优良的文本处理工具。Linux及Unix环境中现有的功能最强大的数据处理引擎之一。它名字来源于创始人Alfred Aho,Peter Jay Weinberger和Brain wilson Kernighan的三个首字母。三位创建者已将他正式定义为“样式扫描和处理语言”。它允许创建剪短的程序,这些程序读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表等。
$ ll /usr/bin/awk
awk所有操作都是基于pattern-action来完成的。如 $ pattern {action} 它将所有的动作操作用一对{}包围起来。其中pattern通常是表示用于匹配输入的文本的关系式或正则表达式,action则是匹配后将执行的动作。在一个完整的awk操作中,这两者只能有一个,若没有pattern则默认匹配输入的全部文本。若没有action,则为打印匹配内容到屏幕。
awk处理文本的方式,是将文本分割成一些字段,然后在对这些字段进行处理。默认情况下,awk以空格作为一个字段的分隔符。
awk基本命令格式 awk [F fs] [-v var=value] [-f prog-file | ‘program test‘] [file...] 其中-F参数用于预先指定前面提到的分段分隔符。-v 用于预先为awk程序指定变量。-f参数用于指定awk命令要执行的程序文件,或在不加-f参数的情况洗直接将程序语句放在这里。最后为awk要处理的文本输入,可以同时输入多个文本文件。
$ vim test
$ awk ‘{print}‘ test
$ awk ‘{if(NR==1){print $1 "\n" $2 "\n" $3} else{print} }‘ test #将test中第一行的每个字段单独显示为一行
$ awk ‘{if(NR==1){OFS="\n" print $1, $2, $3}else{print}}‘ test #将test中第一行的每个字段单独显示为一行
NR和OFS是awk内建的变量。NR表示当前读入的记录数,即当前的处理行数。OFS表示输出时的字段分隔符,默认为空格。$N中N为相应的字段号。他表示引用相应的字段。$0表示引用当前记录的全部内容。
$ awk -F‘.‘ ‘{ if(NR==2){print $1 "\t" $2 "\t" $3}}‘ test #将test中的字段以点为分隔符换成以空格为分隔符
$ awk ‘BEGIN{FS=".";OFS="\t"}{if(NR==2){print $1, $2, $3}}‘ test #print打印的非变量内容都需要用""一对引号抱起来
awk常用的内置变量 FILENAME 当前输入文件名,若有多个文件,则只表示第一个。若输入是来自标准输入,则为空字符串。 $0 当前记录内容 $N N表示字段号,最大值为NF变量的值 FS 字段分割符,由正则表达式表示,默认为空格 RS 输入记录分隔符,默认为\n,即一行为一个记录 NF 当前记录字段数 NR 已经读入字段数 FNR 当前输入文件的记录数 OFS 输出字段分隔符,默认为空格 ORS 输出记录分割符,默认为\n
标签:
原文地址:http://www.cnblogs.com/forerver-elf/p/4705057.html