第11章 Linux正则表达式与三剑客知识应用实践
1、什么是正则表达式?
作用和特殊字符一样。
正则表达式是为处理大量的字符串及文本而定义的一套规则和方法。
假设“@”代表“I am”,“!”代表“oldboy”,
则执行echo “@!”的结果就是输出“I am oldboy”。
2、为什么用正则表达式?
提高效率,快速获取到想要的内容。
3、在哪儿用?
三剑客命令 grep(egrep),sed,awk。
Linux三剑客的正则表达式有如下几个特点:
1、为处理大量文本及字符串而定义的一套规则和方法;
2、其工作时以行为单位进项,即一次处理一行;
3、通过正则表达式可以将复杂的处理任务化繁为简,提高操作Linux的效率;
4、仅被三剑客(grep/egrep、sed、awk)命令支持,其他命令无法使用。
4、易混淆事项:
1、和通配符区别。
2、开发人员正则,一般是Perl兼容正则表达式。
3、Linux三剑客正则表达式*****。
export LC_ALL=C 调整字符集
5、正则表达式的分类:
5.1、基本正则表达式 BRE (grep)
5.1.1 ^ 以....开头 例如:^oldboy就是以oldboy开头
[root@yuzhiwei~/test]# ls -l /data|grep "^d"
drwxr-xr-x 2 root root 6 Mar 20 09:16 oldboy
5.1.2、$ 美元符 以....结尾 例如:oldboy$ 就是以oldboy结尾
5.1.3、 ^$ 空行
5.1.4、 . 匹配任意一个且只有一个字符 类似于通配符的“?”
5.1.5、 \ 让有意义的字符还原本意
5.1.6、 * 重复前面字符0次或多次
5.1.7、 .* 表示所有内容
5.1.8、 [abc] 匹配[]集合内的任意一个字符a或b或c;[abc]也可写成[a-c]
[^abc] 匹配不包含^后的任意字符a或b或c,这里的^表示对[abc]取反,^不用用!替代
5.2、扩展正则表达式 ERE (egrep)
5.2.1、 + 匹配前一个字符一次或一次以上
5.2.2 、? 匹配前一个字符0次或1次
5.2.3、a{n,m} 匹配前一个字符最少n次,最多m次 a{n,} 匹配前一个字符最少n次 a{n} 匹配前一个字符正好n次 a{,m} 匹配前一个字符最多m次
5.2.4 、| 或者 同时过滤多个字符串
5.2.5、() 分组过滤被括起来的东西表示一个整体,另外()的内容可以被后面的/n引用,n为数字,表示引用第几个括号的内容。
\n 引用前面()小括号里面的内容,例如:(ee)\1,就表示匹配eeee
6、元字符
7、****Linux三剑客:awk sed grep
7.1 sed Stream editor 流编辑器
sed是操作、过滤和转换文本内容的强大工具。
常用功能有对文件实现快速增删改查(增加、删除、修改、查询),
其中查询的功能中最常用的2大功能是过滤(过滤指定字符串)和取行(取出指定行)。
用法:sed [选项] + [sed内置命令字符] + [输入文件]
选项:
-n 取消命令的默认输出
-i 直接修改文件内容。而不是输出到终端
-e 允许多次编辑
内置命令字符:
a 追加 append
i 插入 insert
s 替换
g 全局global
p 打印print
d 删除delete
问题1:输出old****girl****.txt的第2-3行内容※。
[root@yuzhiwei~/test]# sed -n '2,3p' oldgirl.txt
问题2:过滤出含有oldboy字符春的行
[root@yuzhiwei~/test]# grep "oldboy" oldgirl.txt
[root@yuzhiwei~/test]# sed -n '/oldboy/p' oldgirl.txt
问题3:删除含有oldboy字符串的行
[root@yuzhiwei~/test]# sed '/oldboy/d' oldgirl.txt
问题4:将文件中的oldboy字符串全部替换成oldgirl
vim替换:
:%s#oldboy#oldgirl#g
sed ‘s#想替换什么#用什么替换#g’ oldgirl.txt
[root@yuzhiwei~/test]# sed 's#oldgirl#oldboy#g' oldgirl.txt
修改文件内容:
[root@yuzhiwei~/test]# sed -i 's#oldgirl#oldboy#g' oldgirl.txt
问题5:****将文件中的oldboy字符串全部替换成oldgirl,同时将QQ号码49000448改为31333741
[root@yuzhiwei~/test]# sed -e 's#oldboy#oldgirl#g' -e 's#49000448#31333741#g' oldgirl.txt
问题6:在oldboy.txt文件的第二行后追加文本
[root@yuzhiwei~/test]# sed '2a I teacher linux.' oldgirl.txt
I am oldboy teacher!
I like badminton ball ,billiard ball and chinese chess!
I teacher linux.
our site is http://www.oldboyedu.com
my qq num is 49000448.
问题7:在oldboy.txt文件的第二行插入文本
[root@yuzhiwei~/test]# sed -i '2i I teacher linux.' oldgirl.txt
问题8:在oldboy.txt文件的第二行插入两行文本
[root@yuzhiwei~/test]# sed -i '2a I teacher linux.\naaaaaa\nbbbbb' oldgirl.txt
删除指定行:
sed -i ‘3d’ oldboy.txt 删除第三行
sed -i ‘5,8’ oldboy.txt 删除5-8行