一、什么是正则
二、grep命令
三、sed命令
一、什么是正则
- 正则就是一串有规律的字符串
- 对于shell脚本编写有很大帮助
- 各种编程语言中都有正则,原理一样
二、grep命令
2.1 grep/egrep工具的使用
格式:grep [-cinvABC] 'word' filename 过滤文件中符合条件的内容
选项:
-c:表示打印符合条件的行数
-n:表示输出符合条件的行及行号
-i:表示不区分大小写
-v:取反,表示打印输出与条件相反的内容,例-v【0-9】表示过滤不含【0-9】的行
-A:后跟数字(有无空格都可以),表示过滤符合条件的行以及下面的n行,例-A2
-B:后跟数字(有无空格都可以),表示过滤符合条件的行以及上面的n行,例-B2
-C:后跟数字(有无空格都可以),表示过滤符合条件的行以及上下各n行,例-C2
-r:遍历(级联),即在子目录或子文件中符合条件的行也会过滤出来
-rn:列出符合条件的内容在各文件中的哪一行
2.2 grep示例
2.3特殊字符类(上)
2.3.1 ^:匹配字符串开头,后跟符号或字母,表示以。。。开头的行
【^0-9】:过滤非0-9的字符
^【^0-9】:过滤以非0-9字符开头的行
2.3.2 .(点):表示任意的一个字符。
例:r.o
2.3.3 *(星):表示任意个字符。即*前的字符重复出现任意次,例:‘r*o’,0次就是表示‘o’
2.3.4 .*(点星):任意0或者多个字符,空行也包括,匹配所有
2.3.5 {}:大括号,表示前面字符的重复范围。
2.4特殊字符类(下)
由于直接写特殊字符,在grep中不能被识别。使用脱义符对特殊字符进行又较麻烦,不是很方便,所以后面的几个特殊字符使用egrep进行试验。
egrep即grep -E,扩展grep
2.4.1 +(加号):表示+前的字符重复出现1次或多次
2.4.2 ?(问号):表示?前的字符重复出现0次或1次
2.4.3 |(竖线):表示或者。若后面跟多个条件,只要满足其中一个就满足要求
三、sed命令
sed和grep相比,sed也能实现grep的功能,但是有点麻烦,而且没有用颜色显示,强项在于替换。
3.1 sed工具
格式: sed -n 'n'p filename
'n':单引号里的n是一个数字,表示第几行
-n:表示只显示我们要打印的行,无关紧要的不显示
p:print ,打印
其他选项:
-e:后面跟多个表达式(匹配行或字符串)
I:不区分大小写
-i配合d使用,删除文件中的内容行(修改了文件内容)可以理解为先vim进入文件,再dd删除
d:只在屏幕上删除行,并把其它的显示出来(未修改文件内容)
''(单引号)里为字符串时,使用 //
3.2特殊字符(与grep的特殊字符意义相同)
-r:sed的转义
.(点)
*(星)
.*(点星)
+(加)
?(问)
|(表示或者)
3.3 替换功能(重要)
sed 'n1,n2s/word1/word2/g' filename:把n1到n2行之间的word1换成word2,不加g则只替换每行的第一个
sed '1,$s/word1/word2/g' filename:把文件中所有的word1换成word2,不加g则只替换每行的第一个
类似Vim中的替换
3.3.1替换字符或字符串示例
3.3.2调换两个字符串的位置
sed -r ‘s/([^:]+):(.*):([^:]+)/\3:\2:\1/’ 把文件中第一段和最后一段的内容调换位置(也可以理解为由:把文件每一行的内容分为三部分,并把第一部分和第三部分的位置进行调换)
[^:]+ : 以非冒号开始,一个或多个字符
\3是一个整体
注:替换或位置调换也只是在屏幕上显示的内容里表示出来,源文件内容没有被修改
3.4直接修改文件的内容
-i选项,可以直接修改源文件内容
sed -i 's/word1/word2/g filename
3.5文件中大小写替换
\u:表示大写
\l:表示小写
- 1. 把每个单词的第一个小写字母变大写:
- sed 's/\b[a-z]/\u&/g' filename
- 2. 把所有小写变大写:
- sed 's/[a-z]/\u&/g' filename
- 3. 大写变小写:
- sed 's/[A-Z]/\l&/g' filename
&:前面word1表示的字符或字符串( 第一个 // 里面的内容)
\b 表示单词的边界,匹配单词的开始或结束
3.6在指定行的上一行或下一行插入指定字符
a\:在指定行下面一行开始插入指定字符
i\:在指定行上面一行开始插入指定字符
sed '1\a 123456789' 1.txt //在文件第一行的下一行插入字符123456789
sed '1\i 123456789' 1.txt //在文件第一行的上一行插入字符123456789