linux学习(七)鸟叔第十一章:正则表达式

        正则表达式是通过一些特殊符号的辅助,可以让用户更轻易的完成【查找,删除,替换】某特定字符串的处理过程。

        注意:正则表达式的一些特殊字符与命令行输入命令的通配符并不一样。不要搞混了!而且并不是所有的命令都支持正则表达式。

目录

 1 正则表达式

1.1  语系对正则表达式的影响

1.2 grep的一些高级用法+正则表示式一些使用

 1.3 sed工具

1.4 扩展正则表达式

2  文件输出格式化数据与相关处理

2.1 格式化打印:printf

2.2 好用的数据处理工具:awk

3 文件对比工具

3.1 以行为单位对比两文件:diff 

3.2 以字节为单位对比两文件:cmp

3.3 补丁升级:patch


 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进行升级即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值