正则表达式(Regular Expression,RE)
一、基本概念
1、正则表达式就是处理字符串的方法,他是以行为单位来进行字符串的处理行为,正则表达式通过一些特殊符号的辅助,可以让用户轻易达到查找、删除、替换某特定字符串处理程序。
正则表达式基本上是一种“表示法”,只要工具程序支持者中表示法,那么该工具程序就可以用来作为正则表达式的字符串处理之用。例如:vi,grep,awk,sed。
2、正则表达式的字符串表示方法依照不同严谨度而分为基础正则表达式与扩展正则表达式。
正则表达式与通配符是完全不一样的东西,通配符代表的是bash接口的一个功能,但是正则表达式是一种字符串处理的表示方式。
二、基础正则表达式
1、首先需要了解语系对基础正则表达式的影响
由于不同语系的编码数据并不相同,所以就会造成数据选取结果的区别。
使用正则表达式时,需要特别留意当时环境语系为何,否则可能发现与别人不同的选取结果。
一般使用语系为:LANG=C。
2、了解一些特殊的符号:
[:alnum:]:代表英文大小写,即0-9,A-Z,a-z
[:alpha:]:代表任何英文大小写字符,即a-z,A-Z。
[:lower:]:代表小写字符,即a-z
[:upper:]:代表大写字符,即A-Z
[:digit:]:代表数字,即0-9
3、基础正则表达式字符:
^word : 待查找的字符串(Word)在行首
word$ : 待查找的字符串(Word)在行尾
. :代表一定有一个任意字符的字符
\ : 转义字符,将特殊符号的特殊意义去除
* :重复零个到无穷多个的前一个字符
[list] : 从字符集合的RE字符里面找出想要选取的字符
[n1-n2] : 从字符集合的RE字符里面找出想要选取的字符范围
[^list] :从字符集合的RE字符里面找出不要的字符串或范围
\{n,m\} :连续n到m个前一个RE字符,若为\{n\}则是连续n个的前一个RE字符,若为\{n,\}则是连续n个以上的前一个RE字符。
强调:正则表达式的特殊字符与一般在命令行输入命令的“通配符”并不相同,例如,在通配符当中的* 代表的是零到无限多个字符的意思,但是在正则表达式中,* 则是重复零到无穷多个的前一个RE字符的意思。
三、简单的字符串选取功能的工具程序,grep
grep命令的一些参数
grep
-a :将binary文件以text文件的方式查找数据
-c :计算找到‘查找字符串’的次数
-i :忽略大小写的不同,所以大小写视为相同
-n :顺便输出行号
-v : 反向选择,即显示出没有‘查找字符串’内容的那一行
--color=auto :可以将找到的关键字部分加上颜色显示
-A :后面可以加数字,为after的意思,除了列出该行外,后续的n行也列出来。
-B :后面可以加数字,为before的意思,除了列出该行外,前面的n行也列出来。
注:grep在数据中查找一个字符串时,是以整行为单位来进行数据的选取的
四、sed工具
sed本身也是一个管道命令,sed还可以将数据进行替换、删除、新增、选取特定行等功能。
1.sed工具的基本使用
sed 参数 动作
-n:使用安静(silent)模式。在一般sed的用法中,所有来自STDIN的数据一般都会被列出到屏幕上,加上-n参数后,则只有经过sed特殊处理的那一行(或者操作)才会被列出来
-e:直接在命令行模式进行sed的动作编辑
-f:直接将sed的动作写在一个文件内,-f filename 则可以执行filename内的sed动作。
-r:sed的动作支持的是扩展正则表达式的语法(默认是基础正则表达式语法)
-i:直接修改读取内容,而不是由屏幕输出。
2.动作说明: [n1][,n2] function
n1, n2 : 不见得会存在,一般代表选择进行动作的行数,举例来说,如果动作需要在10-20行之间进行,则“10,20[动作行为]”
function 参数:
a:新增,a的后面可以接字符串,而这些字符串会在新的一行出现(目前的下一行)
c:替换,c的后面可以接字符串,这些字符串可以替换n1,n2之间的行
i:插入,i的后面可以接字符串,而这些字符串会在新的一行出现(目前的上一行)
p:打印,也就是将某个选择的数据输出,通常p会与参数sed -n 一起运作
s: 取代,可以直接进行取代的工作,通常这个动作可以搭配正则表达式
五、扩展正则表达式
某些时刻为了要简化整个命令操作,使用范围更广泛的扩展正则表达式更方便。
1、扩展正则表达式字符
+ :重复一个或一个以上的前一个RE字符
? :零个或一个的前一个RE字符
| :用或(or)的方式找出数个字符串
() :找出‘组’字符串
()+ :多个重复组的判别。
练习 基础正则表达式练习 鸟哥的Linux私房菜 p350-p356
正则表达式与shell是Linux中的基础,同样也是最难的部分,学成之后,一定大有帮助。
多加练习。