正则表达式是通过一些特殊符号的辅助,可以让用户更轻易的完成【查找,删除,替换】某特定字符串的处理过程。
注意:正则表达式的一些特殊字符与命令行输入命令的通配符并不一样。不要搞混了!而且并不是所有的命令都支持正则表达式。
目录
1 正则表达式
1.1 语系对正则表达式的影响
不同的语系对于字符的编码方式不同,很有可能造成不同人选取的结果不一样,为了避免出现歧义,定义了一些特殊符号表示。
[:alnum:] | 代表英文大小写字符以及数字:0~9、A~Z、a~z |
[:alpha:] | 代表英文大小写字符:A~Z、a~z |
[:digit:] | 代表数字:0~9 |
[:lower:] | 代表小写字符:a~z |
[:upper:] | 代表大写字符:A~Z |
以上五个是必须要知道的,除此之外还有例如blank代表空格键和TAB;graph代表除空格键和TAB以外其他的键;punct代表标点符号等等。
值得注意的是:[:alnum:]所代表的是数字是没有外面[ ]的,如果需要用作匹配的一个字符还需要加一层中括号:[ [:alnum:] ]。
1.2 grep的一些高级用法+正则表示式一些使用
grep [-AB] '查找字符' 文件
-A:后面可跟数字,列出该行外和后续n行
-B:后面可跟数字,列出该行外和前面n行
要注意*,这个go*d可以是gd,也就是说*是可以匹配0个的,若想至少有一个o则需要goo*d。若想表示任意个字符可以用【.*】。
还需要注意[ ]的使用,这个符号表示的是备选的字符其中一个,不会按字符串匹配的。而且[ ]内的^表示的是反选:除了[ ] 里的字符中的字符。与[ ]外^表示句首,这个也需要对比注意。
1.3 sed工具
sed本身也是管道命令,可以分析标准输入,还可以以行为单位进行替换删除、新增、选取等功能。
sed [选项] [操作]
选项:
-n: 安静模式,只有经过sed处理的行才会显示出来
-e:直接在命令行模式上进行sed操作(没有也行)
-f:直接将sed的操作写在一个文件里 -f filename则可以执行filename里的sed操作
-r:sed使用扩展正则表达式方法
-i:直接修改文件内容而不输出到屏幕
操作:[n1[,n2]] function 操作部分务必以‘ ’括注
n1,n2:表示第n1行到n2行进行操作
function有:
a:新增(内容出现在下一行)
c:替换 (例:‘2,5c NO 2-5 number’ 会将2到5行内容换成NO 2-5 number)注意后面的字符串是没有''的
d:删除
i:插入(内容出现在上一行)
p:打印
s:替换 ‘s/要被替换内容/新的内容/g’
n1,n2可以用行首^行尾$来替换。如果用-a或者-i想插入多行记得每行结束要用\结尾,进行转译。并且如果想删除某个匹配正则表达式字符的行,需要用【‘/正则内容/d’】。
要注意grep和sed命令的区别:grep将需要匹配的正则表达式放入了' '中,而sed则是' '中还有操作的命令,而匹配的正则表达式是跟在其后面的且没有' ' 分割。
1.4 扩展正则表达式
grep -E可以使用扩展,但是为了更好区别我们还是用egrep命令(类似于alais)。
+ | 重复【一个或一个以上】的前一个RE字符 |
? | 重复【零个或一个】的前一个RE字符 |
| | 用或的方式找出数个字符串 例如:想找gd或者good egrep -n 'gd|good' regular_express.txt 想去除空白行和#为首的行 egrep -v '^$|^#' regular_express.txt |
( ) | 找出【群组】字符串 将以字符串的形式进行查找 |
( ) + | 多个重复的群组 可以以字符串为单位进行重复 例如:A(xyz)+c 可以查找到Axyzxyzxyzc |
+ 和?的并集等同于基本正则中的*。以上是特殊字符,我们可以看出很多例如!>,其实并不是特殊字符不需要转译。
2 文件输出格式化数据与相关处理
2.1 格式化打印:printf
printf '打印格式' 实际内容
这里的printf的格式和C一样,后面填入的变量用空格分隔就行。而且后面的内容不需要取地址操作,直接写变量内容就行,例子见下awk的例子。
2.2 好用的数据处理工具:awk
相对于sed用于一整行的处理,awk是依次将每一行分成多个字段来处理。每个字段默认是被空格或者Tab隔开,并且依次标号$1、$2、$3...,较为特殊的是$0代表一整行。
awk还内置了三个重要的变量:
- NF:每一行拥有的字段总数
- NR:目前处理到的第几行数据
- FS:目前的分隔符,默认是空格键
awk '条件类型1 {操作1} 条件类型2 {操作2}...' 文件名
例:
分隔符换成:,并且格式化输出数据
awk 'BEGIN{FS=":"} $3<10 {print $1 "\t" $3}'
以NR作为条件,用printf输出
awk ' NR==1{printf" %10c %10c \n",$1."total"}
①这里的条件可以用if,也可以直接用逻辑运算符如例子中所示。
②注意,‘ ’是成对出现的所以‘ ’中需要用到 ‘ ’的地方要换成“ ”。
③例子1所示,由于定义的FS在第二行才能生效,用BEGIN关键词让其首先生效,这样第一行就可以用了。而且在awk中这三个变量可以不用前缀$就可以生效。
④print和printf的区别:
- print是awk中的操作,不需要增加“ ”就可以直接使用,但是只能依次将变量写到对应位置上。一行打印完后自动分行。
- printf是命令,需要用到“ ”,类似于C,变量需要用%c等符号代替。\n才能分行。
⑤ awk有时命令会非常长,可以利用;来作间隔,或者直接【ENTER】隔开也行。
鸟叔书上还有很好的awk参考资料可以阅读。
3 文件对比工具
3.1 以行为单位对比两文件:diff
用处比较广泛,通常是用在ASCII纯文本文件, 也可以是对比目录的差异。
3.2 以字节为单位对比两文件:cmp
3.3 补丁升级:patch
可以将旧文件升级成新文件,首先用diff制作出补丁文件,然后由patch进行升级即可