正则及正则的意义
有这样一个文本文件,我们需要从里面查找 信息时,需要怎么处理呢?
一行行看么,有计算机,可以让计算机帮助我们查找。
计算机如何查找?如何匹配?这里就涉及到匹配规则,这种规则 ,我们可以称之为正规。
正则表达式(Regular Expression)是一种匹配模式,描述的是一串文本的特征。
在linux中,我们可以用 grep/awk/sed 调用正则表达式,来查找相关信息。
一般情况下,是对行进行查找匹配并进行处理的。
为什么 这样?如果直接对文件进行处理,我们考虑这样的情况 ,文件小时,可以直接加载到内存。那么当文件 有几百M,几个G等,很大时,能直接放入么?如果对文件 进行修改,怎么增删改?所以将文件分为更小的部分,以行为单位。便于处理输出。
grep 命令
> global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来.
> grep 主要是用来搜索文件信息。
> 语法大致是这样: 【grep 参数 ‘匹配字符’ 匹配文件】。grep 'root' /etc/passwd
> 参数说明:
> “-c”: count 统计匹配的行数。
> "-i" : 匹配条件忽略字符的大小写。
> "-n”: 打印匹配信息时,输出所在行号。
> “-v”: 取反的意思,打印出不合规则的行。
> “-A","-B","-C":打印匹配信息相邻的行。A=after,B=before,C=centre.
> "-q": 逻辑判断的意思,常和if 一起使用。如:`if grep -q hello a.txt ; then echo yes;else echo no; fi `
> "-r": 递归查询,查询 **目录** 下文件是否有匹配到信息。如:`grep -r "root" /etc/`
- linux下文本行的相关信息
存储的是以”\n“为行结尾。在做匹配信息时,以"^"表示行的开始,以”$“表示行结束。
如 匹配以 # 开头时,可以这样写匹配信息:"^#"。
匹配以"good."结束时,这样写:”good.$“
表示空行时,”^$“。
这里涉及到行中有”^“或是”$“时,写法。[root@cpdl ~]# cat 1.txt good. nice. good hello good.$helo [root@cpdl ~]# grep -n "good.$" 1.txt 1:good. [root@cpdl ~]# grep -n "good.\\$" 1.txt 4:good.$helo
- 字符串匹配
grep -n "root" /etc/passwd grep -vn "nologin" /etc/passwd grep -n '^\(root|bin\)' /etc/passwd
- 字符匹配
grep [0-9] /etc/passwd grep [^0-9] /etc/passwd grep "^root[a-z]*$' /etc/passwd grep "^[rb]" /etc/passwd grep "[^r]oo" /etc/passwd grep '^$' /etc/passwd grep '[^a-zA-Z]' /etc/passwd
- 模糊字符串匹配
grep 'r..t' /etc/passwd grep 'oo*' /etc/passwd #“*”表示零个或多个前面的字符,oo*表示o, oo, ooo..... grep '.*' /etc/passwd |wc -l # ‘.*’表示零个或多个任意字符,空行也包含在内 grep 'o\{2\}' /etc/passwd
- grep扩展命令,egrep
egrep 'o+' 1.txt # 表示1个或1个以上前面字符 egrep 'o?' 1.txt # 表示0个或者1个前面字符 egrep 'roo|body' 1.txt # 匹配roo或者匹配body egrep 'r(oo)|(at)o' 1.txt # 用括号表示一个整体 egrep '(oo)+' 1.txt # 表示1个或者多个 'oo'
. * + ? 总结
. 表示任意一个字符(包括特殊字符)- 表示零个或多个*前面的字符
.* 表示任意个任意字符(包含空行)
+ 表示1个或多个+前面的字符
? 表示0个或1个?前面的字符
其中,+ ? grep不支持,egrep才支持。
- 表示零个或多个*前面的字符
sed
sed: stream editor for filtering and transforming text 用户过滤和转换文本的流编辑器
sed 主要是用来实现查找 替换功能。
命令格式:“sed [option] 'sed command' filename”
-
option 参数说明
-n :只打印模式匹配的行
-e :直接在命令行模式上进行sed动作编辑,此为默认选项
-r :支持扩展表达式
-i :直接修改文件内容
注意,默认sed会首会打印出需要处理的行,再执行命令中的动作。如果只需要显示 匹配到的行,使用 "-n"参数。它常和“p”动作一起使用。
注意的是,sed使用参数 -e 支持对单个文件 进行不同的操作。
如对 m.conf 去除以空行和以“#”开头的行。
写法:sed -e ‘/^$/d’ -e '/^#/d' m.conf
-
sed command 参数 包含以下动作: 查找,处理方法。
-
查找动作,指定操作范围。
查找动作: 以查询方法可分为两类:
1.以行为标识。如 第5行。5
2.查询包含模式的行。 如 包含字符 test的:/test/
以上是单行查询,也可指定查找范围。- 以指定行为查找范围。如5到8行:
'5,8'
- 以查询包含模式指定行。如以包含test1的行 为首行 到 第一个包含end的行 为结尾的行:
/test1/,/end/
- 两个查找方法混合。如:
'4,/test/'
,'/test/,4 '
- 以指定行为查找范围。如5到8行:
- 处理动作:指定处理动作。
处理动作比较多。下面列举常用:
“p” 打印。如:sed -n '1,4p' 1.txt
“d” 删除动作。如:sed '2d' 1.txt
"s/匹配字符串/替换字符串/替换标记" 替换字符串。如:“s/oo/ii/”
匹配字符串和替换字符串,如果需要使用正规表达式,那么option需加 "-r" 参数。
常用替换标记:- g 表示指定的所有行都进行全面替换。否则只替换第一个匹配到的。
- p 表示打印行。
- w 表示操作行替换后写入后面的文件 。如
sed '1,$s/oo/ii/w 2.txt' 1.txt
"!" 表示后面的命令对所有没有被选定的行发生作用。 如:sed '/oo/!p' 1.txt
注意:“!”可以作用于范围。如:sed '/^#/!{/^$/!p}' 1.txt
"a\ 一行内容" 在匹配行后面加入一行文本。
“i\ 一行内容" 在匹配行上面插入文本。
”c\ 一行内容" 用新的文本改变匹配行的文本。
例子:sed '/^hello/a\\--->this is a example' 1.txt
在匹配到以 hello开头的行后,在前面加一行’--->this is a example'。
注意 参数a后面需要跟一"\" 这里需要转义,所以用 “\” 来脱义。
"=" 打印行号。
这里引入"{}"概念,连接的动作,可利用它来标明。并将动作用“;”分隔。
如:sed -n '/good/{=;p}' 1.txt
-
转载于:https://blog.51cto.com/sincethen/2333638