什么是正则表达式
简单地说,正则表达式就是处理字符串的方法,它是以行为单位来进行字符串的处理行为,正则表达式通过一些特殊符号的辅助,可以让用户轻易达到查找、删除、替换某特定字符串的处理程序。
基础正则表达式
语系对正则表达式的影响
- LANG=C时:0 1 2 3 4…A B C D…a b c d…z
- LANG=zh_CN时:0 1 2 3 4…a A b B c C…z Z
一般我们在使用正则表达式时,使用的是兼容于POSIX标准,,因此就使用"LANG=C"这个语系数据来进行。
特殊符号 | 代表意义 |
---|---|
[:alnum:] | 代表英文大消息字符及数字 |
[:alpha:] | 代表任何英文大小写字符 |
[:blank:] | 代表空格键与tab键 |
[:cntrl:] | 代表键盘上面的控制按键,即包括CR,LF,Tab,Del等 |
[:graph:] | 除了空格符外的其他所有按键 |
[:digit:] | 代表数字0-9 |
[:print:] | 代表任何可以被打印出来的字符 |
[:punct:] | 代表标点符号,即"’?!;: |
[:lower:] | 代表小写字母 |
[:upper:] | 代表大写字母 |
[:space:] | 任何会产生空白的字符,包括空格键[Tab] CR 等 |
[:xdigit:] | 代表十六进制的数字类型,0-9,a-f,A-F |
基础正则表达式的练习
有一个regular.txt的文件,其内容如下
"Open Source" is a good mechanism to develop programs.
apple is my favorite food.
Football game is not use foot only.
this dress doesn't fit me.
However,this dress is about $3183 dollars.
GNU is free air not free beer.
Her hair is very beauty.
I can't finish the test.
Oh!The soup taste good.
motorcycle is cheap than car.
This window is clear.
the symbol '*' is represented as start.
Oh! My god!
The gd software is a library for drafting proframs.
You are the best is mean you are the no.1.
The world <Happy> is the same with "glad".
I like dog.
google is the best tools for search keyword.
goooooogle yes!
go!go!Let's go.
# I am Vbird.
例题一:查找特定字符串
- 找’the’关键字
grep -n 'the' regular.txt
- 找不带’the’关键字的字符串
grep -n -v 'the' regular.txt
- 找大小写不敏感的’the’字符串
grep -n -i 'the' regular.txt
例题二:利用中括号[]来查找集合字符
- 如果我想要查找test和taste两个单词时,发现他们都包含’t?st’,可以如下查找
grep -n t[ae]st regular.txt
- 如果我想要查找带有’oo’的,但是’oo’前面的字母不能是’g’,可以使用反向选择[^]来完成
grep -n '[^g]oo' regular.txt
- 接着上题,如果’oo’前面不想接小写字母,那么下面四种都可以
grep -n '[^a-z]oo' regular.txt
grep -n '[A-Z]oo' regular.txt
grep -n '[^[:lower:]]oo' regular.txt
grep -n '[[:upper:]]oo' regular.txt
例题三:行首与行尾字符^$
- 例题一中我们能查询到一行字符串里面有the,如果只显示出现在行首的the,可以这样做:
grep -n '^the' regular.txt
- 如果想要开头是符号的那行显示,可以:
grep -n '^[[:punct:]]' regular.txt
发现了吗? ^符号在[]之内和之外的含义是完全不同的,在中括号[]里面代表反向选择,在中括号外面则代表定位在行首
- 那么如果想要找出行尾结束为’.'的那一行,应该为
grep -n '\.$' regular.txt
这里由于小数点有其他含义,所以需要转义字符’/'来加以解除其特殊含义。
例题四:任意一个字符.与重复字符*
.(小数点):代表一定有一个任意字符的意思
*(星号):代表重复前一个0到无穷次的意思,为组合形态
- 例如例题二找tatse和test,可以这样写了:
grep -n 't.st' regular.txt
- 列出至少有两个’o’的字符串,是’o*'还是’oo*‘还是’ooo*呢’?
grep -n 'ooo*' regular.txt
说明一下:首先代表的是前一个字符出现0次到无穷次的意思,那么’o’可以代表为空字符,那么就会将所有数据全部显示出来。而’oo*‘则是至少有一个o出现就可以显示,所以按照题意就是’ooo*’
- 如果我想要以g开头以g结尾的字符串,当中的字符串可有可无,请写出命令:
grep -n 'g.*g' regular.txt
例题五:限定联系RE字符范围
- 如果我想要找3~6个o的联系字符串,这时使用*就不可以了,需要使用限定范围的字符{}。但因为{}的符号在shell中是有特殊意义的,因此必须使用转义字符\让他失去特殊意义:
grep -n 'o\{3,6\}' regular.txt
基础正则表达式字符
RE字符 | 意义与范例 |
---|---|
^word | 意义:待查找的字符串在行首 |
word$ | 意义:待查找的字符串在行尾 |
. | 意义:代表一定有一个任意字符的字符 |
\ | 意义:转义字符,将特殊符号的特殊意义去除 |
* | 意义:重复0到无穷多个的前一个字符 |
[list] | 意义:从字符集合的RE字符里面找出想要选取的字符 |
[n1-n2] | 意义:从字符集合的RE字符里面找出想要选取的字符范围 |
[^list] | 意义:从字符集合的RE字符里面找出不要的字符串或范围 |
{n,m} | 意义:连续n到m个的前一个RE字符,若为{n}则是连续n个的前一个RE字符,若为{\n,}则是连续n个以上的前一个RE字符 |
扩展正则表达式
RE字符 | 意义与范例 |
---|---|
+ | 意义:重复一个或一个以上的前一个RE字符 |
? | 意义:零个或一个的前一个RE字符 |
! | 意义:用或的方法找出数个字符串 |
() | 意义:找出"组"字符串 |
()+ | 意义:多个重复组的判别 |
sed工具
sed [-nefri] [动作]
参数:
-n : 使用安静模式。在一般sed的用法中,所有来自STDIN的数据一般都会被列出到屏幕上。但是如果加上-n参数后,则只有经过sed特殊处理的那一行才会被列出来
-e :直接在命令行模式上进行sed的动作编辑
-f :直接将sed的动作写在一个文件中,-f filename 则可以执行filename内的sed动作
-r :sed的动作支持的是扩展型正则表达式的语法(默认是基础正则表达式)
-i :直接修改读取的文件内容,而不是由屏幕输出
动作说明:[n1[,n2]] function
n1,n2:不见得会存在,一般代表选择进行动作的行数,举例来说,我要在10行到20行之间进行动作,则’10,20[动作行为]’
function有下面的参数:
a:新增,a的后面可以接字符串,这些字符串会在新的一行出现(当前的下一行)
c:替换,c的后面可以加字符串,这些字符串替换n1,n2之间的行
d:删除,因此后面通常不接任何参数
i:插入,字符串会在新的一行出现(当前的上一行)
p:打印
s:替换,通常搭配正则表达式。
- 以行为单位的新增/删除功能
# 1.将regular.txt的内容列出,并将2-5行删除
nl regular.txt | sed '2,5d'
# 2.若是要删除第3行到最后一行
nl regular.txt | sed '3,$d'
# 3.在第二行后加上"hello world"
nl regular.txt | sed '2a hello world'
# 4.在第二行前加上"hello world"
nl regular.txt | sed '2i hello world'
# 5.在第二行后加上2行,分别是"hello world"和"hello myself"
nl regular.txt | sed '2a hello world \ hello myself'
nl regular.txt | sed '2a hello world \nhello myself'
最后一个根据GNU版本会有不同的写法,我个人的版本支持的是第二种。
- 以行为单位的替换与显示功能
#将第二行到第五行的内容替换为'line2-5 disappear'
nl regular.txt | sed '2,5c line2-5 disappear'
# 列出第8到第20行
nl regular.txt | sed -n '8,20p'
-n代表安静模式,否则会重复输出指定行
- 部分数据的查找并替换的功能
sed ‘s/要被替换的字符串/新的字符串/g’
# 通过ifconfig eth0 结合grep和sed来筛选出自己的ip地址
ifconfig eth0 | grep 'inet 地址'| sed 's/^.*地址://g'|sed 's/广播:.*$//g'