什么时正则表达式?
简单地说,正则表达式就是处理字符串的方法,它是以行为单位来进行字符串的处理行为,正则表达式通过一些特殊符号的辅助,可以让用户轻易达到查找、删除、替换某特定字符串的处理程序。
支持正则表达式的工具程序:vi、grep、awk等
正则表达式的字符串表示方式依照不同的严谨度而分为基础正则表达式与扩展正则表达式。
基础正则表达式
使用正则表达式时,需要特别留意当时的环境的语系为何,否则可能会发现与别人不相同的选取结果。
由于一般我们在练习正则表达式时,使用的是兼容于POSIX的标准,所以使用“C”这个语系!因此下面有许多练习都是使用“LANG=C”这个语系数据来进行的。
需要知道的一些特殊符号:
[:alnum:]:代表英文大小写字符及数字,即0-9,A-Z,a-z;
[:alpha:]:代表任何英文大小写字符,即A-Z,a-z;
[:upper:]:代表大写字符;
[:lower:]:代表小写字符;
[:digit:]:代表数字。
grep的一些高级参数
关于grep的一些复习
grep分析一行信息,若当中有我们需要的信息,就将该行拿出来。
grep [-acinv] [--color=auto] ‘查找字符串’ filename
-a:将binary文件以text的方式查找数据;
-c:计算找到’查找字符串‘的次数;
-i:忽略大小写;
-n:顺便输出行号;
-v:反向选择,即显示出没有’查找字符串‘内容的那一行。
grep进阶
grep [-A] [-B] [--color=auto] ‘搜寻字符串’ filename
-A:后面可加数字,为after的意思,除了列出该行,后续的n行也列出来;
-B:后面可加数字,为before的意思,除了列出该行外,前面的n行也列出来。
grep在数据中查找一个字符串时,是以整行为单位来进行数据的选取的。
符号^在字符集合符号(中括号[])之内与之外是不同的!在[]内代表’反向选择‘,在[]之外则代表定位在行首的意义。行尾的标志则是$。
小数点.:代表一定有一个任意字符的意思;
星星号*:代表重复前一个字符,0到无穷多次的意思,为组合形态。
想要限制区间范围内的重复字符数用{},但是因为{与}的符号在shell是有特殊意义的,因此,我们必须要使用转义字符\来让它失去特殊意义才行。语法例子如下:
找出g后面接2到5个字符,然后再接一个g的字符串。
grep -n --color=auto ‘go\{2,5\}g’ regular_express.txt
sed工具
sed本身就是一个管道命令,可疑分析stdin,而且sed还可以将数据进行替换、删除、新增、选取等的功能。语法如下:
sed [-nefr] [动作]
-n:使用安静(silent)模式,在一般sed的用法中,来自STDIN的数据一般都会被列出到屏幕上。如果加上-n,则只有经过特殊处理的那一行才会被列出来。
-e:直接在命令行模式进行sed的动作编辑;
-f:直接将sed的动作写在一个文件内,-f filename则可以执行filename内的sed动作;
-r:sed的动作支持的是拓展型正则表达式的语法;
-i:直接修改读取的文件内容,而不是屏幕输出。
动作说明: [n1[,n2]] function
n1,n2:不见得会存在,一般代表选择进行动作的行数。
function有下面这些参数:
a:新增,a的后面可以接字符串,而这些字符串会在新的一行出现(目前的下一行);
c:替换,c后面可以接字符串这些字符串会替换n1,n2之间的行;
d:删除,因为时删除,所以d后面通常不接任何参数;
i:插入,i的后面可以接字符串,而这些字符串会在新的一行出现(目前的上一行);
p:打印,也就是将某个选择的数据打印出来;
s:替换,可以直接替换的工作。
sed还可以用行为单位进行部分数据的搜寻并取代的功能:
sed ’s/要被取代的字符串/新的字符串/g’
拓展正则表达式
拓展型正则表达式的几个RE特殊符号:
+:重复一个或一个以上的前一个RE字符;
例:查找(god)(good)(goood):
egrep -n ‘go+d’ regular_express.txt
?:零个或一个的前一个RE字符;
例:查找(gd)(god):
egrep -n ‘go?d’ regular_express.txt
|:用或(or)的方式找出数个字符串;
例:查找gd或good:
egrep -n ‘gd|good’ regular_express.txt
():找出“组”字符串;
例:查找(glad)或(good):
egrep -n ‘g(la|oo)d’ regular_express.txt
()+:多个重复组的判断:
例:将“AxyzxyzxyzxyzC”用echo显示,然后查找:
echo ‘AxyzxyzxyzxyzC’ | egrep ‘A(xyz)+C’
文件的格式化与相关处理
格式化打印:printf
printf可以帮我们将数据输出的结果格式化,而且支持一些特殊字符。语法:
printf ‘打印格式’ 实际内容
参数:
关于格式方面的几个特殊样式:
\a:警告声音输出;
\b:退格键;
\f:清除屏幕;
\n:输出新一行;
\r:亦即Enter按键;
\t:水平的[TAB]键;
\v:垂直的[TAB]键;
\xNN:NN为两位数的数字,可以转化数字为字符;
关于C程序语言内,常见的变量格式:
%ns:那个n是数字,s代表string,即多少个字符;
%ni:那个n是数字,i为代表integer,即多少整数字数;
%N.nf:那个n和N都是数字,f代表floating(浮点),如果有小数字数,假设我们共要十个位数,但小数点有两位,即为%10.2f。
awk:好用的数据处理工具
awk比较倾向于将一行分成数个’字段‘来处理。因此,awk相当适合处理小型的数据数据处理。awk的通常运作模式:
awk ‘条件类型1{动作1} 条件类型2{动作2} ...’ filename
整个awk的处理流程:
1.读入第一行,并将第一行的数据填入$0,$1,$2等变量中;
2.依据条件类型的限制,判断是否需要进行后面的动作;
3.做完所有动作与条件类型;
4.若还有后续的“行”的数据,则重复上面1~3的步骤,直到数据读完为止。
awk的内置变量:
NF:每一行($0)拥有的字段总数;
NR:目前awk所处理的是“第几行”数据;
FS:目前的分隔字符,默认是空格键。
重要事项:
1.所有awk的动作,即在{}内的动作,如果有需要多个命令辅助时,可以利用分号间隔,或者直接以Enter键来隔开每个命令;
2.逻辑化运算当中,如果是“等于”的情况,则务必使用两个等号“==”;
3.格式化输出时,在printf的格式设置当中,务必加上\n,才能进行分行;
4.与bash、shell的变量不同,在awk当中,变量可以直接使用,不需要加上$符号。
文件对比工具:diff、cmp、patch
diff [-bBi] from-file to-file
from-file:作为欲比较文件的文件名;
to-file:作为目的的比较文件的文件名;
-b:忽略一行当中仅有多个空间的区别;
-B:忽略空白行的区别;
-i:忽略大小写的不同。
cmp [-s] file1 file2
-s:将所有的不同点的字节处都列出来。
patch:
更新:patch -pN < patch_file
还原:patch -R -pN < patch_file
-p:后面的N代表取消基层目录的意思;
-R:代表还原,将新的文件还原成原来的旧版本。