手机版
你好,游客 登录 注册 搜索
背景:
阅读新闻

正则表达式与grep和sed

[日期:2017-10-04] 来源:Linux社区  作者:shenxm [字体: ]

目录

1.正则表达式
2.grep
3.sed

grep和sed需要正则表达式,我们需要注意的正则表达式与通配符用法的区分。

1.正则表达式

REGEXP,正则表达式:由一类特殊字符以及文本字符所编写的模式,其中有些字符(元字符)不表示字符字母意义,而表示控制或通配的功能,可通过man regex来查看更详细的信息。
正则表达式有两类,一个是基本正则表达式BRE,另一个是扩展的正则表达式ERE。
正则表达式的引擎:采用不同算法,检查处理正则表达式的软件模块PCRE(Perl Compatible Regular Expressions)
元字符的分类:字符匹配、匹配次数、位置锚定、分组。

1.字符匹配

.:匹配任意单个字符
[ ]:匹配指定范围内的任意单个字符([.]就是.)
[ ^ ]:匹配指定范围外的任意单个字符
[:alnum:]:字母和数字
[:alpha:]:代表任何英文大小写字符,亦即 A-Z, a-z
[:lower:]:小写字母 [:upper:] 大写字母
[:blank:]:空白字符(空格和制表符)
[:space:]:水平和垂直的空白字符(比[:blank:]包含的范围广)
[:cntrl:]:不可打印的控制字符(退格、删除、警铃...) )
[:digit:]:十进制数字 [:xdigit:] 十六进制数字
[:graph:]:可打印的非空白字符
[:print:]:可打印字符
[:punct:]:标点符号

2.匹配次数

匹配次数是用在要指定次数的字符后面,用于指定前面的字符要出现的次数。

*:匹配前面的字符任意次,包括0次,贪婪模式:尽可能长的匹配
.*:任意长度的任意字符
\?:匹配其前面的字符0 或1次
\+:匹配其前面的字符至少1次
\{n\}:匹配前面的字符n次 次
\{m,n\}:匹配前面的字符至少m 次,至多n次 次
\{,n\}:匹配前面的字符至多n次
\{n,\}:匹配前面的字符至少n次

3.位置锚定

位置锚定是用于定位出现的位置。

^:行首锚定,用于模式的最左侧
$:行尾锚定,用于模式的最右侧
^PATTERN$:用于模式匹配整行
^$:空行
^[[:space:]]*$:空白行
\< 或 \b:词首锚定,用于单词模式的左侧
\> 或 \b:词尾锚定;用于单词模式的右侧
\<PATTERN\>:匹配整个单词

4.分组

分组:\(\)将一个或多个字符捆绑在一起,当作一个整体进行处理,如:\(root\)\+。分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为:\1, \2, \3, ...\1表示从左侧起第一个左括号以及与之匹配右括号之间的模式所匹配到的字符。
示例\(string1\+\(string2\)*\);\1 :string1\+\(string2\)*;\2 :string2
后向引用:引用前面的分组括号中的模式所匹配字符 , 而非模式本身。
\|:或者
示例a\|b:a 或b;C\|cat: C 或cat ;\(C\|c\)at:Cat 或cat

5.扩展的正则表达式

扩展的正则表达式,顾名思义,就是在正则表达式上的扩展,是在元字符匹配方面的写法简化。
大部分的元字符和正则表达式相同,这里把不同的记录一下:
字符匹配:

[ ]:指定范围内的字符。

次数匹配:

?:0 或1次
+:1 次或多次
{m}:匹配m次
{m,n}:至少m ,至多n次

分组:
() 将一个或多个字符捆绑在一起,当作一个整体进行处理。
|:或者
示例:a|b:a 或b;C|cat:C 或cat;(C|c)at:Cat 或cat

上述就是我所知道的正则表达式内容了,可能有所遗漏,大家可以通过man帮助补足,下面我们看进入正题,也就是运用上了。

2.grep

grep:Global search REgrular expression and Print out the line
grep 的作用:文本搜索工具,根据用户指定的“模式”对目标文本逐行进行匹配检查,并打印匹配到的行。
grep的模式:由正则表达式字符及其文本字符所编写的过滤条件。
grep的用法:

grep [OPTION]... PATTERN [FILE]...
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
常用的[option]:
--color=auto:对匹配到的文本着色显示
-v:显示不被pattern 匹配到的行,反向选择
-i:忽略字符大小写
-n:显示匹配的行号
-c:统计匹配的行数
-o:仅显示匹配到的字符串
-q:静默模式,不输出任何信息
-A #:after,后#行 ,显示包含这行后续#行
-B #:before,前#行
-C #:context,前后各#行
-e:实现多个选项间的成逻辑or关系,grep –e ‘cat ’ -e ‘dog’ file
-w:匹配整个单词,(字母,数字,下划线不算单词边界)
-E:使用ERE
-F:相当于fgrep ,不支持正则表达式
-l <范本样式>:列出文件内容符合指定的范本样式的文件名称。
-h <范本样式>:在显示符合范本样式的那一列之前,不标示该列所属的文件名称。
-H <范本样式>:在显示符合范本样式的那一列之前,标示该列的文件名称。
-e <范本样式>:指定字符串作为查找文件内容的范本样式。

上述选项中有个-E选项,这个就是可以支持使用扩展的正则表达式,当然这个选项有另个写法:grep -E == egrep
还有个-F选项,这个用法是相当于fgrep的,即grep -F==fgrep不支持正则表达式的使用,也就是使用它时,你可以使用通配符。
举个示例:

正则表达式与grep和sed

grep的用法多种多样,大家可以多加尝试!

3.sed

sed:Stream EDitor,又名行编辑器。
sed:是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓存区中,称为“模式空间”(patternspace),接着用sed命令处理缓存区中的内容,处理完成后,把缓存区的内容送往屏幕。然后读入下一行,执行下一个循环。如果没有使用诸如‘D’的特殊命令,那么会在两个循环之间清空模式空间,但不会清空保留空间。这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。
sed的功能:主要用来自动编辑一个或多个文件,简化对文件的反复操作,编写转换程序等,且支持正则表达式!
使用方法:

sed [OPTION]... {script-only-if-no-other-script} [input-file]...
常用[option]:
-n:不输出模式空间内容到屏幕,即不自动打印
-e:多点编辑,-e sm2 -e sm1
-f /PATH/SCRIPT_FILE:从指定的脚本文件中,读取出脚本内容,并合并到sed COMMAND中进行执行。通俗的理解为将脚本写在了文件中。
-r:支持使用扩展正则表达式
-i:直接修改源文件。如果在命令中加入了 -i 选项,源文件的内容将会被直接修改掉。
-i[SUFFIX]:这还是-i 选项,这个选项的意思是说,如果在使用该选项的过程中指定了后缀名称,那么该命令在执行的过程中会先将源文件备份成以[SUFFIX] 为后缀的文件,然后对文件进行操作

从使用方法中看到了{script-only-if-no-other-script},这个代表了在模式空间和保留空间的处理过程,也就是怎么处理的,这里称为了script。那么这个script是什么呢?怎么书写呢?下面就来说下有关地址定界、编辑命令、高级编辑命令,这些就是组成scrip的元素。

地址定界:就是说明用来处理一行中的那个些部分的。

不给地址:对全文进行处理
#:指定的行/pattern/能够被模式匹配到的每一行
#,#:从第n行到第m行
#,+#:从第n行,加上其后面m行
/pat1/,/pat2/:符合第一个模式和第二个模式的所有行
#,/pat1/:从第n行到符合 /pat1/ 这个模式的行
1~2 :~ 这个符号表示步进,1~2 表示的是奇数行
2~2:表示的是偶数行

编辑命令:地址定界后,对范围内的内容进行相关编辑。

d:删除模式空间匹配的行,并立即启用下一轮循环
p:打印当前模式空间内容,追加到默认输出之后
q:读取到指定行之后退出
a [\]text:在指定行后面追加文本支持使用\n 实现多行行后追加
i [\]text:在行前面插入文本
c [\]text:替换行为单行或多行文本
w /path/somefile:保存模式匹配的行至指定文件
r /path/somefile:读取指定文件的文本至模式空间中匹配到的行后
=:为模式空间中的行打印行号
!:模式空间中匹配行取反处理
s///:查找替换, 支持使用其它分隔符,s@@@ ,s###
:对一行进行多次操作的命令的分割
&:配合s///使用,代表前面所查找到的字符等,&sm ;sm&。
g:行内全局替换。也可以指定行内的第几个符合要求的进行替换:2g,就表示第2个替换。
p:显示替换成功的行
w /PATH/TO/SOMEFILE:将替换成功的行保存至文件中

高级编辑命令:也是对定界范围内的内容进行处理了,不过是处理起来更加高级。

P:打印模式空间开端至\n 内容,并追加到默认输出之前
h:把模式空间中的内容覆盖至保持空间中;m > b
H:把模式空间中的内容追加至保持空间中; m>>b
g:从保持空间取出数据覆盖至模式空间; b>m
G:从保持空间取出内容追加至模式空间; b>>m
x:把模式空间中的内容与保持空间中的内容进行互换; m <->b
n:读取匹配到的行的下一行覆盖至模式空间; n>m
N:读取匹配到的行的下一行追加至模式空间; n>>m
d:删除模式空间中的行; delete m
D:如果模式空间包含换行符,则删除直到第一个换行符的模式空间中的文本,并不会读取新的 输入行,而使用合成的模式空间重新启动循环。如果模式空间不包含换行符,则会像发出d 命令那样启动正常的新循环

看着有点有,这里写几个用法示例:

sed ‘2p’ /etc/passwd
sed –n ‘2p’ /etc/passwd
sed –n ‘1,4p’ /etc/passwd
sed –n ‘/root/p’ /etc/passwd
sed –n ‘2,/root/p’ /etc/passwd
sed -n ‘/^$/=’ file
sed –n –e ‘/^$/p’ –e ‘/^$/=’ file
sed ‘/root/a\superman’ /etc/passwd
sed ‘/root/i\superman’ /etc/passwd
sed ‘/root/c\superman’ /etc/passwd
sed ‘/^$/d’ file
sed ‘1,10d’ file
nl /etc/passwd | sed ‘2,5d’
nl /etc/passwd | sed ‘2a tea’
sed 's/test/mytest/g' example
sed –n ‘s/root/&superman/p’ /etc/passwd
sed –n ‘s/root/superman&/p’ /etc/passwd
sed -e ‘s/dog/cat/’ -e ‘s/hi/lo/’ pets
sed –i.bak ‘s/dog/cat/g’ pets
sed -n 'n;p' FILE
sed '1!G;h;$!d' FILE
sed 'N;D‘ FILE
sed '$!N;$!D' FILE
sed '$!d' FILE
sed ‘G’ FILE
sed ‘g’ FILE
sed ‘/^$/d;G’ FILE
sed 'n;d' FILE
sed -n '1!G;h;$p' FILE

上面这些示例大家可以都尝试下,多尝试就知道什么意思了!
上述所有内容就是我所知道的有关grep和sed以及配合正则表达式的用法了,它们功能很强大,能处理绝大部分的文本、文件问题。若上述有那些不对的地方,欢迎指出,谢谢!

本文永久更新链接地址http://www.linuxidc.com/Linux/2017-10/147269.htm

linux
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款