基础正则表达式
作者:互联网
目录
1. 基础正则表达式
正则表达式(Regular Expression,或称为常规表示法)
简单地说,正则表达式就是处理字符串的方法,它以行为单位进行字符串的处理操作,正则表达式通过一些特殊符号的辅助,可让用户轻易地完成【查找、替换、删除】某特定字符串地处理
1.1 语系对正则表达式的影响
使用正则表达式时,需要特别留意当时环境的语系是什么,否则可能会发现与别人不相同的选取结果
例如:在英文大小写的编码顺序中,zh_CN.big5及C这两种语系的输出结果分别如下:
- LANG=C 时:0 1 2 3 4 … A B C D … Z a b c d …z
- LANG=zh_CN时:0 1 2 3 4 … a A b B c C d D … z Z
为避免这样编码所造成的英文与数字的选取问题,我们需了解一些特殊符号
特殊符号 | 代表意义 |
---|---|
[:alnum:] | 代表英文大小写字符及数字 0 ~ 9、A ~ Z、a ~ z |
[:alpha:] | 代表任何英文大小写字符 A ~ Z、a ~ z |
[:blank:] | 代表空格键与[Tab]按键 |
[:cntrl:] | 代表键盘上控制按键 CR、LF、Tab、Del等 |
[:digit:] | 代表数字 0 ~ 9 |
[:xdigit:] | 代表十六进制的数字类型 0 ~ 9、A ~ F、a ~ f 的数字与字符 |
[:graph:] | 不包含空格符(空格键与[Tab]按键)的其他所有按键 |
[:lower:] | 代表小写字符 a ~ z |
[:upper:] | 代表大写字符 A ~ Z |
[:print:] | 代表任何可以被打印出来的字符 |
[:punct:] | 代表标点符号(punctuation symbol) " ’ ? ! ; : # $ |
[:space:] | 任何会产生空白的字符 空格键、[Tab]、CR等 |
1.2 grep的高级选项
[dmtsai@study ~] grep [-A] [-B] [--color=auto] '查找字符' filename
选项与参数:
-A : 后面可加数字,为after的意思,后续的n行显示出来(包括本行)
-B : 后面可加数字,为befer的意思,前面的n行显示出来(包括本行)
--color=auto : 将正确的那个选取数据列出颜色
范例1:
用【dmesg】列出内核信息,再以【grep】找出内含qxl的那一行
[dmtsai@study ~] dmesg | grep 'qxl'
范例2:
承上,将识别到的关键字显色,且加上行号来显示
[dmtsai@study ~] dmesg | grep -n --color=auto 'qxl'
范例3:
承上,再关键字所在行的前两行与后三行也一起识别出来显示
[dmtsai@study ~] dmesg | grep -n -A3 -B2 --color=auto 'qxl'
1.3 基础正则表达式练习
例题的文本内容如下:
Windows的换行符( ^M$ )
Linux的换行符( ^M )
关于grep:
grep是“global search regular expression and print out the line”的简称,意思是全面搜索正则表达式,并将其打印出来。这个命令可以结合正则表达式使用,它也是linux使用最为广泛的命令
用法:
[dmtsai@study ~] grep [参数]
-i : 搜索时,忽略大小写
-c : 只输出匹配行的数量
-l : 只列出符合匹配的文件名,不列出具体的匹配行
-n : 列出所有的匹配行,显示行号
-h : 查询多文件时不显示文件名
-s : 不显示不存在、没有匹配文本的错误信息
-v : 显示不包含匹配文本的所有行
-w : 匹配整词
-x : 匹配整行
-r : 递归搜索
-q : 禁止输出任何结果,已退出状态表示搜索是否成功
-b : 打印匹配行距文件头部的偏移量,以字节为单位
-o : 与-b结合使用,打印匹配的词据文件头部的偏移量,以字节为单位
例题1:
查找特定字符串
范例1:
查找含字符 the 的行
[dmtsai@study ~] grep -n 'the' regular_express.txt #正向选择the
#[-n] : 列出所有的匹配行,显示行号
范例2:
查找不含 the 的行并显示在屏幕上
[dmtsai@study ~] grep -vn 'the' regular_express.txt #反向选择the
#[-n] : 列出所有的匹配行,显示行号
#[-v] : 显示不包含匹配文本的所有行
例题2:
利用中括号[ ]来查找集合字符
(不论[ ]中有几个字符,它都仅代表【一个】字符)
范例1:
[dmtsai@study ~] grep -n 't[ae]st' regular_express.txt
范例2:
找到含 oo 的字符
[dmtsai@study ~] grep -n 'oo' regular_express.txt
范例3:
找到含 oo 的字符且前面不含g
注意:
- ^ 在[ ]内代表反向选择
- ^ 在[ ]外代表定位在行首
[dmtsai@study ~] grep -n '[^g]oo' regular_express.txt
范例4:
找到含 oo 的字符且前面不含小写字母
注意:
- ^ 在[ ]内代表反向选择
- ^ 在[ ]外代表定位在行首
方法1:
[dmtsai@study ~] grep -n '[^a-z]oo' regular_express.txt
方法2:
[dmtsai@study ~] grep -n '[^[:lower:]]oo' regular_express.txt
范例5:
查找的字符串是有数字的那一行
方法1:
[dmtsai@study ~] grep -n '[0-9]' regular_express.txt
方法2:
[dmtsai@study ~] grep -n '[[:digit:]]' regular_express.txt
例题3:
行首与行尾字符 ^$
范例1:
列出行首为the的行
[dmtsai@study ~] grep -n '^the' regular_express.txt # ^制表符
范例2:
开头是小写字母的行列出
注意:
- ^ 在[ ]内代表反向选择
- ^ 在[ ]外代表定位在行首
方法1:
[dmtsai@study ~] grep -n '^[a-z]' regular_express.txt
方法2:
[dmtsai@study ~] grep -n '^[[:lower:]]' regular_express.txt
范例3:
找出开头不是英文字母的行
[dmtsai@study ~] grep -n '^[^a-zA-Z]' regular_express.txt
范例4:
找出行尾结束为小数点( . )的那一行
[dmtsai@study ~] grep -n '\.$' regular_express.txt
范例5:
找出空白行
[dmtsai@study ~] grep -n '^$' regular_express.txt
范例6:
不要文件【/etc/rsyslog.conf】中的空白行以及以#开头的行
[dmtsai@study ~] grep -v '^$' /etc/rsyslog.conf | grep -v '^#'
# -v '^$' 代表不要空白行
# -v '^#' 代表不要#开头的那行
例题4:
任意一个字符 . 与重复字符 *
范例1:
找出g??d的字符串,开头是g而结束是d
[dmtsai@study ~] grep -n 'g..d' regular_express.txt
【*】代表【重复0个或多个前面的RE字符(正则字符)】
【o*】代表【拥有空字符或一个o以上的字符】
范例2:
找出至少两个o以上的字符串的行(需要ooo*)
[dmtsai@study ~] grep -n 'ooo*' regular_express.txt
范例3:
找出g开头与g结尾的字符串所在行,开头与结尾间的字符可有可无,可用【g*g】
[dmtsai@study ~] grep -n 'g*g' regular_express.txt
【g*】代表【空字符或一个以上的g在加上后面的g】
范例4:
找到g…g形式的字符串,可用【g.*g】
这里的【.*】代表【0个或多个任意字符】
[dmtsai@study ~] grep -n 'g.*g' regular_express.txt
范例5:
找出任意数字的行
[dmtsai@study ~] grep -n '[0-9][0-9]*' regular_express.txt
例题5:
限定连续RE字符(正则字符)范围{ }
限制一个范围区间内的重复字符数,如找出2-5个o的连续字符串,这时应该用限定范围的字符{ }
因为左花括号( { )与右花括号( } )符号在shell内有特殊意义,所以必须用转义符( \ )让其失去在shell中的意义
范例1:
找到2个o的字符串
[dmtsai@study ~] grep -n 'o\{2\}' regular_express.txt
# \{ 和 \} 将花括号在shell中的特殊意义进行转义,失去原意义进而代表限制范围
范例2:
找出g后接2-5个o,然后再接一个g的字符串
[dmtsai@study ~] grep -n 'o\{2,5\}' regular_express.txt
范例3:
找出g后接6个o
- 可用 gooo*g
- 可用 go\ {2,\ }g
[dmtsai@study ~] grep -n 'o\{2,\}' regular_express.txt
1.4 基础正则表达字符集合(characters)
RE字符 | 意义 |
---|---|
^word | 待查找的字符串(word)再行首 |
word$ | 待查找的字符串(word)再行尾 |
. | 代表【一定有一个任意字符】的字符 |
\ | 转义符,将特殊符号的特殊意义去除 |
* | 重复0个到无穷个的前一个RE字符 |
[list] | 字符集合的RE字符,里面列出想要选取的字符 |
[n1-n2] | 字符集合的RE字符,里面列出想要选取的字符范围 |
[^list] | 字符集合的RE字符,里面列出不要的字符串或范围 |
\ {n,m\ } | 连续n到m个的【前一个RE字符】 若是\ {n\ }则是连续n个的前一个RE字符 若是\ {n,\ }则是连续n个以上的前一个RE字符 |
1.5 sed 工具
sed 命令是利用脚本来处理文本文件
sed 可依照脚本的指令来处理、编辑文本文件
sed 主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等
[dmtsai@study ~] sed [参数]
-e或--expression=<script> : 以选项中指定的script来处理输入的文本文件
-f<script文件>或--file=<script文件> : 以选项中指定的script文件来处理输入的文本文件
-h或--help : 显示帮助
-n或--quiet或--silent : 仅显示script处理后的结果
-V或--version : 显示版本信息
1.5.0 以行为单位的新增 / 删除功能
范例1:
将【/etc/passwd】的内容列出并且打印行号,同时将第2到最后一行删除
[dmtsai@study ~] nl /etc/passwd | sed '2,$d'
# nl命令是一个很好用的编号过滤工具。该命令可以读取 File 参数(缺省情况下标准输入),计算输入中的行号,将计算过的行号写入标准输出。
# '2,$d' 中d是删除
# $代表最后一行
范例2:
在【/etc/passwd】的第3行(第2行后)加上【drink tea】字样
[dmtsai@study ~] nl /etc/passwd | sed '2a drink tea' #2a放在第2行后添加
[dmtsai@study ~] nl /etc/passwd | sed '2i drink tea' #2i放在第2行前添加
1.5.1 以行为单位的替换与显示功能
范例1:
将【/etc/passwd】第2-5行的内容替换成为【No 2-5 number】字样
[dmtsai@study ~] nl /etc/passwd | sed '2,5c No 2-5 number'
范例2:
仅列出【/etc/passwd】文件内的第5-7行
[dmtsai@study ~] nl /etc/passwd | sed -n '5,7p'
或者
[dmtsai@study ~] cat -n /etc/passwd | head -n 7 | tail -n 2 #先取出前7行,再在此7行中取出后2行
1.5.2 部分数据的查找并替换的功能
除了整行处理模式外,还可以以行为单位i进行部分数据的查找并替换功能
[dmtsai@study ~] sed 's/要被替换的字符/新的字符/g'
1.5.3 直接修改文件内容(危险操作)
范例1:
利用【sed】将regular_express.txt内每一行结尾若为 【 . 】则换成【!】
[dmtsai@study ~] sed -i 's/\.$/\!/g' regular_express.txt
范例2:
利用【sed】在regular_express.txt 最后一行加入【# This is a test】
[dmtsai@study ~] sed -i '$a # This is a test' regular_express.txt # $a代表最后一行($)后面(a)
标签:字符,grep,dmtsai,正则表达式,study,基础,regular,txt 来源: https://blog.csdn.net/weixin_48524215/article/details/113921716