简单的说,正规表示法就是处理字符串的方法,他是以行为单位来进行字符串的处理行为,正规表示法透过一些特殊符号的辅助,可以让使用者轻易的达到【搜寻/删除/取代】某特定字符串的处理程序。
正规表示法基本上是一种【表示法】,只要工具程序支持这种表示法,那么该工具程序就可以用来作为正规表示法的字符串处理之用。例如 vi, grep, awk ,sed 等。
正规表示法的字符串表示方式依照不同的严谨度而分为:基础正规表示法与延伸正规表示法。
【正规表示法与通配符是完全不一样的东西】
【通配符(wildcard)代表的是 bash操作接口的一个功能】,但【正规表示法则是一种字符串处理的表示方式】。
基本正规表示法
对字符排序有影响的语系数据就会对正规表示法的结果有影响。
正规表示法也需要支持工具程序来辅助才行。
语系对正规表示法的影响
zh Tw.big5 及 C 这两种语系的输出结果分别如下:
LANG=C 时:0 1 2 3 4 ... A B C D ...Z a b c d ...z
LANG=zh_TW 时:0 1 2 3 4 ... a A b B c C d D ... z Z
上面的顺序是编码的顺序,可以很清楚的发现这两种语系明显就是不一样。
所以,使用正规表示法时,需要特别留意当时环境的语系为何,否则可能会发现与别人不相同的撷取结果。
一些特殊符号:
grep 的一些进阶选择
grep [-A] [-B] [--color=auto] '搜寻字符串' filename
grep 在数据中查寻一个字符串时,是以"整行”为单位来进行数据的撷取的。也就是说,假如一个文件内有10 行,其中有两行具有你所搜寻的字符串,则将那两行显示在屏幕上,其他的就丢弃了。
基础正规表示法字符汇总
正规表示法的特殊字符与一般在指令列输入指令的通配符并不相同
通配符当中的*
代表的是【0~无限多个字符】的意思,但是在正规表示法当中,*
则是【重复到无穷多个的前一个 RE字符】的意思~使用的意义并不相同。
sed 工具
sed 本身是一个管线命令,可以分析 standard input, 而且 sed 还可以将数据进行取代、删除、新增、撷取特定行等等的功能。
sed [-nefr] [动作]
sed后面接的动作,请务必以' '
两个单引号括住
除了整行的处理模式之外,sed还可以用行为单位进行部分数据的搜寻并取代的功能
sed 's/要被取代的字符串/新的字符串/g'
sed 后面学吧。。。
延伸正规表示法
特别强调的是,!
在正规表示法当中并不是特殊字符,所以,如果想要查出来文件中含有!
与>
的字行时,可以这样:
grep -n '[!>]' regular_express .txt
文件的格式化与相关处理
格式化打印:printf
printf 可以将资料输出的结果格式化,而且支持一些特殊的字符
printf '打印格式' 实际内容
%8.2f 的意义:字符宽度为8,小数位有两位。
printf 除了可以格式化处理之外,还可以依据 ASCII 的数字与图形对应来显示数据。
awk:好用的数据处理工具
相较于 sed 常常作用于一整个行的处理,awk 则比较倾于一行当中分成数个【字段】来处理。因此,awk 相当的适合处理小型的数据数据处理。
awk '条件类型1{动作1} 条件类型2{动作2} ...' filename
awk 后面接两个单引号并加上大括号来设定想要对数据进行的处理动作。awk 可以处理后续接的文件,也可以读取来自前个指令的 standard output 。但 awk 主要是处理【每一行的字段内的数据】,而默认的【字段的分隔符为空格键或[tab]键】。
在 awk 的括号内,每一行的每个字段都是有变量名称的,那就是 $1,$2...
等变量名称。
整个 awk 的处理流程是:
1.读入第一行,并将第一行的资料填入$0,$1,$2…等变数当中;
2.依据"条件类型"的限制,判断是否需要进行后面的"动作";
3.做完所有的动作与条件类型;
4.若还有后续的【行】的数据,则重复上面1~3的步骤,直到所有的数据都读完为止。
awk 是【以行为一次处理的单位】,而【以字段为最小的处理单位】
awk 的内建变量
awk 的逻辑运算字符
awk 注意事项:
1.awk 的指令间隔:所有 awk 的动作,亦即在 {}
内的动作,如果有需要多个指令辅助时,可利用分号【;
】间隔,或者直接以[Enter]按键来隔开每个指令;
2.逻辑运算当中,如果是【等于】的情况,则务必使用两个等号【==】;
3.格式化输出时,在 printf 的格式设定当中,务必加上 \n
,才能进行分行;
4.与 bash shell 的变量不同,在 awk 当中,变量可以直接使用,不需加上 $ 符号。
文件比对工具
什么时候会用到文件的比对啊?通常是【同一个软件包的不同版本之间,比较配置文件与原始档的差异】。很多时候所谓的文件比对,通常是用在 ASCII 纯文本档的比对上的。
diff
diff 就是用在比对两个文件之间的差异的,并且是以行为单位来比对的。一般是用在 ASCII 纯文本档的比对上。由于是以行为比对的单位,因此 diff 通常是用在同一的文件(或软件)的新旧版本差异上。
diff [-bBi] from-file to-file
cmp
cmp主要也是在比对两个文件,他主要利用【字节】单位去比对,因此,当然也可以比对 binary file( diff主要是以【行】为单位比对, cmp 则是以【字节】为单位去比对,这并不相同)
cmp [-l] file1 file2
# -l : 将所有的不同点的字节处都列出来,因为 cmp 预设仅会输出第一个发现的不同点
patch
旧的文件升级为新的文件:先比较先旧版本的差异,并将差异档制作成为补丁档,再由补丁档更新旧文件。
patch 指令可以将旧版数据更新到新版(主要亦由diff 建立patch 的补丁来源文件)
patch -pN < patch_file # 更新
patch -R -pN < patch_file # 还原
# -P:后面可以接【取消几层目录】的意思
# -R:代表还原,将新的文件还原成原来旧的版本
文件打印准备:pr,可以具有标题,可以加入页码。
标题中会有,【文档时间】、【文档档名】、【页码】
太多了,学不完。。。。
《鸟哥的Linux私房菜-基础篇》学习笔记