ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

基础正则表达式

2021-02-21 23:59:08  阅读:195  来源: 互联网

标签:字符 grep dmtsai 正则表达式 study 基础 regular txt


目录

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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有