回忆以前的内容:
* 表示:任意长度的任意字符
?表示:任意单个字符
[]表示:指定范围内的
[^]表示:指定范围外的
正则表达式:Regular EXPression,REGEXP
元字符:
. 表示:匹配任意单个字符
[] 表示:匹配指定范围内的任意单个字符
[^] 表示:匹配指定范围外的任意单个字符
匹配次数(贪婪模式:尽可能长的匹配)
* 表示:匹配其前面的字符任意次
例子:a,b,ab,aab,acb,adb,amnb 问a*b能匹配到哪些字符串?
答:b,ab,aab
.* 表示:任意长度的任意字符
a.*b 表示匹配以a开头,以b结尾的任何字符串。
\? 表示:匹配其前面的字符1次或0次
\{m,n\} 表示:匹配其前面的字符至少m次,至多n次
\{m\}表示:匹配其前字符m次
文本查找
grep,egrep, fgrep
grep:根据模式,搜索文本,将符合模式的文本行显示出来。
Patten:文本字符和正则表达式的元字符组合而成的匹配条件
剑客一:grep
grep [OPTIONS] PATTERN [FILE...]
Option:-i 忽略大小写
--colour 匹配出的字符,用颜色高亮显示
-v 反向匹配,显示没有被匹配的行
-o 只显示被模式匹配到的字符串
-E 使用扩展正则表达式
-A #
-B #
-C #
例子:
例子:
位置锚定:
^ 表示:锚定行首,此字符后面的任意内容必须出现在行首
$ 表示:锚定行尾,此字符后面的任意内容必须出现在行尾
例子:找出/etc/passwd下以w结尾的行
grep ‘w$’/etc/passwd
找出/etc/passwd 下以b开头以h结尾 切出现在行胃尾的行
grep ‘b..h$’/etc/passwd
^$ 表示:空白行
例子:统计/etc/inittab 下有多少空白行
grep ‘^$’ /etc/inittab | wc -l
找出/etc/inittab下以数字结尾的行
grep ‘[[:digit:]]$’/etc/inittab
\<或\b 表示:锚定词首,其后面的任意字符必须作为单词首部出现
\>或\b 表示:锚定词尾,其后面的任意字符必须作为单词尾部出现
\<root\> 表示:精确匹配某个单词
分组:
\(\)
\(ab\)* 表示ab作为一个整体出现0次到无限次
例子:
正则表达式:
分为:Basic REGEXP 基本
Extended REGEXP 扩展
扩展正则表达式:
字符匹配:
. 指:匹配任意单个字符
[] 指:匹配某范围内的任意单个字符
[^]指:匹配某范围外的任意单个字符
次数匹配:
* 表示:匹配其前面的字符任意次
?表示:匹配其前面的字符1次或0次
+ 指:匹配其前面的字符至少一次,相当于\{1,\}
{m,n} 表示:匹配其前面的字符至少m次,至多n次
位置锚定,分组同正则表达式
或者:
| 表示:或者,or
a | b a或b有一个就行
C | cat 表示: C 或 cat
找出组字符串 ()
例子 找出含有glad和good的行,使用或|
egrep -n ‘g(la|oo)d‘ regular_express.txt
多个重复组的判断()+
将 AxyzxyzxyzxyzC 用echo显示
echo "AxyzxyzxyzxyzC" | egrep‘A(xyz)+C‘ 这行命令的意思就是找出开头是A结尾是C,中间有1个或多个xyz的字符串
命令:grep - E = egrep
扩展正则表达式直接就用不要转义符
基本的 \? \+ \(\)
扩展的+ ()
剑客二:sed
sed命令是一种在线编辑器,一次处理一行内容。原理:把当前处理的行存储在临时缓冲区(模式空间pattern space)中,sed命令处理缓存区中的内容,处理完成之后,把缓冲区的内容发送的屏幕;然后处理下一行,直到文件的末尾。文件内容没有改变,除非使用重定向输出。sed主要用于自动编辑一个或多个文件;简化文件的反复操作。
sed命令格式
sed [-nefr] [动作]
-n 使用安静模式,只有被sed匹配到的行才被显示出来。即,取消默认的输出
-e 直接在命令行模式进行sed动作编辑
-f 将sed动作写入一个文件内。-f filename 可以运行filename内的sed动作
-r 支持延伸型正规表示法
-i 直接修改读取的文件内容
命令:
d:除
p:显示模式空间中的内容。与-n配合使用,打印匹配的行
a \text:在行后面追加文本,支持使用\n实现多行追加
i \text:在行前面追加文本,支持使用\n实现多行追加
c \text:替换行为单行或多行文本
w /path/to/somefile 保存模式空间匹配到的行到指定文件中
r /path/from/somefile 读取指定文件的文本流到模式空间中的行后
= 为模式空间中的行打印行号
!取反条件
s/// 查找替换,支持使用其他分隔符,[email protected]@@,S###
替换标记:
g 全局替换
p 显示替换成功的行
w /PATH/TO/SOMEFILE 将替换成功的结果保存到文件
例子:
d命令:
1.删除文件/etc/passwd的第二行
2.删除第5到10行
[[email protected]~]# nl /etc/passwd | sed ‘5,10d‘
3.删除最后一行
[[email protected]~]#nl /etc/passwd | sed ‘$d‘
4.删除所有含有root的行
[[email protected]~]# nl /etc/passwd | sed ‘/root/d‘
s命令
1.&表示被sed找到的部分,然后在后面加入要替换的内容
2.把test替换为mytest
3. [[email protected]~]# sed -n ‘[email protected]\(love\)[email protected]\[email protected]‘ test.txt
love被标记为1,所有的loveable都被替换为loveer,被替换的行会被打印出来。
4.把模板test和Test之间的行,每行的末尾加上zhou
e命令,多点编辑
1.-e命令允许在同一行里执行多条命令。下面这条命令,先删除test.txt文件的第1到5行,把test替换为check
sed -e ‘1,5d‘ -e ‘s/test/check/‘test.txt
2.- -expression可以给sed表达式直接赋值
sed --expression=‘s/test/check/‘ --expression=‘/love/d‘
写入命令:w
下图是,向test1.txt文件中写入含有test的行。注意:不是追加,是覆盖写入
从文件读入,r
下图是:从test1.txt中读入含有test的行
追加命令,a在匹配行的下一行追加
插入命令,i 在匹配行的上一行追加