目录
前言
正则表达式是通过一些特殊字符的排列,用以搜寻、取代、删除一列或单列字符串,简单的说,正则表达式就是用在字符串的处理上面的一项表达式。本文对鸟哥linux私房菜中所介绍的常用正则表达式进行记录总结,方便后续查阅。
一、正则表达式是什么?
正则表达式就是处理字符串的方法,他是以行为单位来进行字符串的处理行为,正则表达式通过一些特殊字符的辅助,可以让使用者轻易的达到搜寻、删除、取代某特定字符串的处理程序!
二、基础正则表达式
1.正则表达式中的特殊字符
使用正则表达式时,需要特别留意当时环境为何语系,不同的语系使用正则表达式处理的结果可能会不同,一些特殊的字符可以避免这种差异。
特殊字符 | 代表意义 |
[:alnum:] | 代表英文大小写字符及数字 |
[:alpha:] | 代表英文大小写字符 |
[:blank:] | 代表空格和Tab两者 |
[:cntrl:] | 代表键盘上面的控制按键,包括CR,LF,Tab,Del等等 |
[:digit:] | 代表数字 |
[:graph:] | 除了空格和Tab按键外的其他所有按键 |
[:lower:] | 代表小写字母 |
[:print:] | 任何可以被打印出来的字符 |
[:punct:] | 代表标点符号,如“ ‘ ? ! ; :# $ 等等 |
[:upper:] | 代表大写字母 |
[:space:] | 任何会产生空白的字符,包括空格,Tab,CR等 |
[:xdigit:] | 代表16进位的数字类型,包括:0-9,A-F,a-f的数字和字符 |
2.bash中grep的基础用法及结合正则表达式的进阶用法
grep的基础用法
grep [-acinv] '查找的字符串' filename
选项参数
-a : 不要忽略二进制数据,将二进制文件按照视为文本文件搜寻
-c : 计算找到'查找字符串'的次数
-i : 忽略大小写
-n ; 输出行号
-v : 反向输出,显示不包含匹配文本的所有行
grep的进阶用法
grep [-A] [-B] '查找的字符串' filename
选项参数
-A : 后面可以加数字n,为after的意思,除了列出查找出的该行外,后面的n行也列出来
-B : 后面可以加数字n,为before的意思,除了列出查找出的该行外,前面的n行也列出来
3.行首、行尾字符 ^ $
行首字符^
#不要开头是英文字母的行
grep -n '^[^a-zA-Z]' filename
#or
grep -n '^[^[:alpha:]]' filename
#对于符号 ^ ,在字符集合符号(括号[])之内和之外是不同的,在[]内代表的是反向选择,在[]之外则代表定位在行首的意义。
行尾字符$
#不显示空白行以及'#'注释行
grep -v '^$' filename | grep -v '^#'
#通过(^$)可以匹配空白行
4.任意一个字符 . 与重复字符 *
在bash中,通配符 * 用来代表任意(0或这多个)字符,但是正则表达式中却有不同的含义
. (小数点):代表一定有一个任意字符的意思
* (星号):代表重复前一个字符,0到无穷多次的意思
5.限定范围的字符{}
{}用来限制一个范围区间内的重复字符数,因为 { 与 } 的字符在shell是由特殊意义的,因此,必须使用跳脱字符 \ 来让其失去特殊意义。
#找出g后面接2到5个o,然后再接一个g的字符串
grep -n 'go\{2,5\}g' filename
三、sed工具
1.sed概述
sed本身也是一个管线命令,可以分析standard input,而且sed还可以将数据进行取代、删除、新增、选取特定行等等的功能。
sed [-nefr] [动作]
选项与参数:
-n :使用安静模式,在一般sed的用法中,所有来自STDIN的数据一般都会被列出到屏幕上。但是如果
加上-n参数后,则只有经过sed特殊处理的那一行(或者动作)才会被列出来。
-e :直接在指令模式上进行sed动作编辑。
-f :直接将sed的动作写在一个文件内,-f filename则可以执行filename内的sed动作。
-r :sed的动作支持的是延伸型正则表达式的语法。(预设的是基础正则表达式语法)
-i :直接修改读取的文件内容,而不是由屏幕输出。
动作说明:[n1[,n2]]function
n1,n2 :不一定会存在,一般代表的是选择进行动作的行数。
function:
a :新增,a的后面可以接字符串,而这些字符串会在新的一行出现,目前的下一行。
c :取代,c的后面可以接字符串,这些字符串可以取代n1-n2的行。
d :删除,
i :插入,i的后面可以接字符串,而这些字符串会在新的一行出现,目前的上一行。
p :打印,即将某个选择的数据打印出,通常与参数sed -n一起运作。
s :取代,例 1,20s/old/new/g
2.以行为单位的新增、删除
#将filename中内容列出并且打印行号,同时,将2~5行删除
nl filename | sed '2,5d'
#在第二行后加上********
nl filename | sed '2a ********'
#在第二行后面加入两行字,例如:drink tea or ...... 与 drink beer?
nl filename | sed '2a drink tea or ......\
drink beer?'
3.以行为单位的取代、显示
#将2-5行的内容替换为 No 2-5 number
nl filename | sed '2,5c No 2-5 number'
#仅列出filename文件内的第5-7行,若不加-n,文件内容会全部输出,且5-7行会重复输出
nl filename | sed -n '5,7p'
4.部分数据的搜寻并取代的功能
sed 's/要被取代的字符串/新的字符串/g' #g为全局匹配
#删除包含字符 'MAN' 且为批注行的数据
cat filename | grep 'MAN' | sed 's/#.*$//g' #原本的批注数据会变成空白行
cat filename | grep 'MAN' | sed 's/#.*$//g' | sed '/^$/d' #删除空白行
5.直接修改文件内容
不使用管线命令或数据流重导向
#每一行结尾若为 . 则换成 !
sed -i 's/\.$/\!/g' filename
最后一行加入# This is a test
sed -i '$a # This is a test' filename #$代表最后一行
四、延伸正则表达式
使用延伸正则表达式,可以使用 grep -E ,不过更建议使用egrep。
字符 | 意义 |
+ | 重复一个或一个以上的前一个字符 |
? | 零个或一个前一个字符 |
| | 用或的方式找出数个字符串 |
() | 找出群组字符串 |
()+ | 多个重复群组的判别 |
总结
以上为个人认为常见的正则表达式的汇总