《鸟哥私房菜》-第十一章-正则表达式和文件格式化处理

正则表达式

正则表达式(英语:Regular Expression,在代码中常简写为regex、regexp或RE),又称正规表示式正规表示法正规表达式规则表达式常规表示法,是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串(一个字符串,匹配其他字符串)

正则表达式就是处理字符串的方法,***以行为单位***进行字符串的处理,可以完成查找、替换、删除操作。

不同语言所支持的正则表达式都有所差异,一般分为DFA和NFA两种引擎

正则表达式在Linux中一般分为两种:基础正则表达式和扩展正则表达式,扩展正则表达式提供了群组功能。

这篇博文记录鸟哥私房菜的笔记,叙述在Linux terminal中正则表达式的使用。在Linux中有些命令是支持正则表达式的,如:grep、sed、awk,而有些命令并不支持正则表达式,如:ls

Linux中的通配符似乎与正则表达式十分类似,但二者是完全不同的两个事物。通配符是Linux bash中支持的一个功能,而正则表达式是专门用来处理字符串的一个工具。

基础正则表达式(grep、sed)

在这一部分,我们将介绍基础正则表达式的一些语法和工具及一些特殊的特性。

语系对正则表达式的影响

语系是什么?语系就是我们所使用的编码方式,我们知道在不同编码方式中同一字符对应的源二进制码是不同的,而正则表达式在底层中是匹配二进制码所以不同的语系,同一正则表达式匹配的模式可能是不同的。

在这里我们举一个例子:

  • LANG=C时,编码顺序为:ABCD…Zabcd…z

  • LANG=zh_CN时,编码顺序为:aAbBcC…zZ

    在这里当我们使用[a-z]时,LANG=C选取的是所有小写英文字母,而LANG=zh_CN选取的结果包括大写字母,所以一定要注意使用正则表达式时的语系。

    一般我们使用正则表达式所使用的语系是LANG=C

而正则表达式为了避免语系对输出结果的影响,设置了一些特殊字符,匹配特定的字符,在不同语系下的结果是相同的。
在这里插入图片描述

grep命令中正则表达式的使用

grep支持基础正则表达式,egrep或grep -E支持扩展正则表达式

首先,grep命令是以行为单位来查找字符串的,我们来介绍一些他的语法

grep [-acinvA] PATTERN filename
-a:将二进制文件以文本文件的方式查找数据
-c:计算找到 对应字符 的次数
-i:查找时忽略大小写的区别
-v:反向查找,即输出不匹配的行
-n:输出时输出行号
--color=auto:找的的关键字部分加上颜色的显示
-A:后面可加数字n,出了列出该行外,后续的n行也列出来
-B:后面可加数字n,出了列出该行外,前面的n行也列出来
基础正则表达式的语法

在这里插入图片描述
使用时一定要注意这是Linux中的正则表达式,适用于Linux,其他语言并不一定支持(正则表达式有许多流派)

还有,\{n,m\}中花括号要进行转义,因为{}在shell中有特殊含义,他表示限定表达式开始与结束

sed工具

sed即Stream editor,流编辑器

我们首先来介绍sed工具的语法:

sed [-nefi] 'function'
-n:一般所有来自stdin的数据都会被列到屏幕上,加上-n后只有被sed处理过的行才会被列到屏幕上
-e:用于多点编辑,每一个-e选项后面都可以接一个function
-i:直接修改所读取文件的内容,而不是打印到屏幕上
-f:直接将sed的操作(function)卸载一个文件中,-f filename则可以执行文件中的操作

'n1[,n2]function' 说明:
a:新增:a后接字符,这些字符将在目前的下一行出现
c:替换:c后接字符,这些字符将替换n1-n2行
d:删除:后通常不接字符
i:插入:i后接字符,这些字符将在目前的上一行出现
p:打印:将sed选取的数据打印出来
s:替换:1,23s/old/new/g # 1-23行中的old替换为new

例: sed '2,$d' # 删除2至最后一行,$代表最后一行

sed工具可以用来做很多事情:

  • 以行为单位的新增/删除
  • 以行为单位的替换/显示
  • 以行为单位进行部分数据的查找替换
  • 直接修改文件内容

扩展正则表达式

扩展正则表达式提供了更多的功能,使用时注意grep不支持扩展正则表达式,egrep才支持扩展正则表达式
在这里插入图片描述

更多正则表达式的内容可以参考《精通正则表达式》

文件的格式化与相关处理(printf、awk、diff、cmp、patch、pr)

文件的格式化即对数据进行排版,没错就是排版,使数据的显示更加规整,且不用修改源文件

格式化打印(printf)

printf可以将我们的输出数据格式化显示,且支持一些特殊字符,语法如下:

printf '打印格式' 实际内容

例:printf '%s\t %s\t %s\t %s\t%s\t \n' $(cat printf.txt) # 先执行cat printf.txt作为printf的输入,然后每个字符串间以[Tab]隔开,进行格式化
awk,数据处理工具

sed工具通常是以行为单位进行处理的,而awk一般将一行分为数个字段来处理,默认的分隔符为空格键和[Tab]键。

awk既可以处理文件,也可以读取来自前一个命令的标准输出

文件比对工具(diff、cmp、patch、pr)

diff用来比对ASCII纯文本文件,cmp用来比对非纯文本文件

diff

diff以行为单位比较两个ASCII纯文本文件的差异,语法如下:

diff [-bBi] from-file to-file
from-file:原始比对文件名
to—file:目标比对文件名
-b:忽略一行中空白的差异,即空白个数的差异不作为差异输出
-B:忽略空白行的差异
-i:忽略大小写的不同
cmp

cmp以字节为单位去比对两个非纯文本文件,语法如下:

cmp [-l] file1 file2
-l:将所有不同点的字节处都列出来,因cmp默认只输出第一个不同点
patch

path命令利用补丁文件,来更新/还原文件

pr

使用pr打印文件内容时,会标有文件时间、文件名、页码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值