正则二

==============================

00. 课程回顾说明
1) 系统中的符号作用
a 便于搜索查找信息(文件名 文件中数据内容)
b 表示一些特殊意义,便于我们操作 ~ . ..
c 便于配合三剑客进行分析过滤文件内容
2) 系统中常见符号分类
系统特殊符号
基础符号: $ !(histroy) | #
引号符号: ""(会对部分特殊符号做解析)
‘‘(所见即所得)
``(将引号里面的命令执行的结果交给外面的命令进行调用处理)
定向符号: > >> 2> 2>> <(tr xargs) <<EOF(用于生成多行信息)
路径符号: . .. ~ -
逻辑符号: && 与 并且 前面条件满足(真), 执行后面的操作
|| 或 或者 前面条件不满足(假),执行后面的操作
系统通配符号: 用于匹配文件名称!!!
匹配符号: * 注意型号放置位置
序列符号: {} {01..05} {01..05..2} {01,03,07}
{a..d}{1..5}
实现快速备份数据的方式:
cp /etc/hosts{,.bak}
实现快速还原数据的方式:
cp /etc/hosts{.bak,}

系统正则符号: 用于匹配文件内容!!!

01. 正则符号说明(用于结合三剑客命令用于过滤或处理编辑文件)
编写模拟测试文件
cat >>~/oldboy_test.txt<<EOF
I am oldboy teacher!
I teach linux.

I like badminton ball ,billiard ball and chinese chess!
my blog is http://oldboy.blog.51cto.com
our site is http://www.etiantian.org
my qq num is 49000448.

not 4900000448.
my god ,i am not oldbey,but OLDBOY!
EOF

基础正则符号:basic regular expression (BRE)
扩展正则符号:extended regular expression (ERE)

基础正则符号:
a 尖角符号:^
以什么开头的信息进行过滤出来
需求01: 将以I开头的信息都过滤出来
[[email protected] ~]# grep "^I" ~/oldboy_test.txt
I am oldboy teacher!
I teach linux.
I like badminton ball ,billiard ball and chinese chess!

需求02: 将不是以I开头的信息都过滤出来
[[email protected] ~]# grep -v "^I" ~/oldboy_test.txt

my blog is http://oldboy.blog.51cto.com
our site is http://www.etiantian.org
my qq num is 49000448.

not 4900000448.
my god ,i am not oldbey,but OLDBOY!

企业需求: web服务配置文件请进行精简化处理
grep -v "^#" nginx.conf.default >nginx.conf

find / -type f -name "^oldboy" 错误
find / -type f -name "oldboy*" 正确

b 美元符号:$
以什么结尾的信息进行过滤出来
需求01: 请找出以m结尾信息, 并且显示上1行 和 下2行的信息
[[email protected] ~]# grep "m$" -A 2 -B 1 ~/oldboy_test.txt
I like badminton ball ,billiard ball and chinese chess!
my blog is http://oldboy.blog.51cto.com
our site is http://www.etiantian.org
my qq num is 49000448.

错误说明:
如何确认每行结尾有空格信息
方法一:
cat -A ~/oldboy_test.txt
my blog is http://oldboy.blog.51cto.com $
方法二:
vim 底行模式输入命令 --- :set list

c 尖角美元符号:^$
取出文件中空行信息
grep "^$" ~/oldboy_test.txt
grep -v "^$" ~/oldboy_test.txt

d 点符号: .
表示匹配任意一个且只有一个字符
[[email protected] ~]# grep "." ~/oldboy_test.txt
I am oldboy teacher!
I teach linux.
I like badminton ball ,billiard ball and chinese chess!
my blog is http://oldboy.blog.51cto.com
our site is http://www.etiantian.org
my qq num is 49000448.
not 4900000448.
my god ,i am not oldbey,but OLDBOY!
[[email protected] ~]# grep "." ~/oldboy_test.txt -o
I

a
m

o
l

e 星号符号: *
匹配星号前面一个字符连续出现0次或多次 0次?
[[email protected] ~]# echo aababababb|grep "ab*" -o
a
ab
ab
ab
abb
[[email protected] ~]# echo aababababb|grep "a*b*" -o
aab
ab
ab
abb

f 点和星号组合: .*
匹配所有信息
grep ".*" ~/oldboy_test.txt

需求01: 找出以m开头的行,并且以m结尾的行,请过滤出来
grep "^m.*m$" ~/oldboy_test.txt
my blog is http://oldboy.blog.51cto.com

需求02: 只过滤一行中部分内容:
以m 到o结束的信息
my blog is http://o
说明: 正则符号在匹配数据信息的时候具有贪婪特性
[[email protected] ~]# grep "^m.*o" ~/oldboy_test.txt
my blog is http://oldboy.blog.51cto.com
my god ,i am not oldbey,but OLDBOY!
[[email protected] ~]# grep "^m.*/o" ~/oldboy_test.txt
my blog is http://oldboy.blog.51cto.com
说明: 避免贪婪特性的方法,实在指定一行信息中唯一节点信息

g 转译符号: \
1) 将一些有意义的符号进行转译, 变为一个普通符号

需求: 请取出以.结尾行信息
[[email protected] ~]# grep "\.$" ~/oldboy_test.txt
I teach linux.
my qq num is 49000448.
not 4900000448.

2) 将一些没有意义的符号进行转译,变为有意义符号
\n 换行符号 linux
\r 换行符号 windows
\t 制表符号(tab)

3) 可以将扩展正则符号转换成普通正则让grep sed命令可以直接识别‘
[[email protected] oldboy_dir]# grep "o\?" ~/oldboy_test03.txt
gd
god
good
goood
gooood

h 括号符号:[]
匹配括号中每一个字符,并且匹配的关系是或者的关系
需求: 找出文件中oldboy 和 oldbey两个单词信息
grep "oldb[oe]y" ~/oldboy_test.txt

企业应用: 找寻文件中字母 数字信息
grep "[0-9a-zA-Z]" ~/oldboy_test.txt

i 尖号和中括号组合使用 : [^]
对中括号里面匹配的字符信息进行排除
grep "[^0-9a-zA-Z]" ~/oldboy_test.txt --- 将字母数字都排除,只留下符号信息
尖号和中括号组合使用 : ^[]
以中括号里面匹配的字符作为一行开头的字符
grep "^[Im]" ~/oldboy_test.txt

结论:正则符号注意事项
①. 按照每行信息进行过滤处理
②. 注意正则表达符号禁止中文
③. 附上颜色信息进行正则过滤 --color=auto/--color
④. 基础正则符号可以被三剑客命令直接识别 grep sed awk
5. 扩展正则符号不可以被三剑客命令中老二和老三直接识别
sed命令想识别正则符号: sed -r
grep命令想识别正则符号: egrep / grep -E

扩展正则符号:
a 加号符号:+
匹配加号前面一个字符连续出现1次或者多次
[[email protected] ~]# egrep "0+" ~/oldboy_test.txt
my qq num is 49000448.
not 4900000448.
[[email protected] ~]# grep -E "0+" ~/oldboy_test.txt
my qq num is 49000448.
not 4900000448.

grep -E "[0-9]+" ~/oldboy_test.txt -o

终极目标
cat >>~/oldboy_test02.txt<<EOF
赵 110101199901045121
钱 110101199901045121
孙 11010119990104512X
李 110101299901045121
陈 oldboy
周 110101199981045121
吴 110101199901045121
郑 11010149990104512X
刘 oldgirl
王 110101199908045121
冯 110111199901045121
EOF
问题解决方式:
[[email protected] ~]# egrep -v "[0-9X]+" ~/oldboy_test02.txt
陈 oldboy
刘 oldgirl
[[email protected] ~]# egrep "[^0-9X]+" ~/oldboy_test02.txt
赵 110101199901045121
钱 110101199901045121
孙 11010119990104512X
李 110101299901045121
陈 oldboy
周 110101199981045121
吴 110101199901045121
郑 11010149990104512X
刘 oldgirl
王 110101199908045121
冯 110111199901045121

b 竖线符号:|
或者关系符号
[[email protected] ~]# egrep "oldboy|oldbey" ~/oldboy_test.txt
I am oldboy teacher!
my blog is http://oldboy.blog.51cto.com
my god ,i am not oldbey,but OLDBOY!

企业应用: 在配置文件可能有#信息 空行信息, 都要进行过滤掉不要显示
egrep -v "^#|^$" 文件名称

扩展: 如何利用sed完成+ |信息过滤
1) 如何过滤数值信息
sed -rn ‘/[0-9]+/p‘ ~/oldboy_test.txt
2) 如何过滤两个字符串信息(oldboy oldbey)
sed -nr ‘/oldboy|oldbey/p‘ ~/oldboy_test.txt

c 括号符号:()
将多个字符信息进行汇总为一个整体
[[email protected] ~]# egrep "(oldboy)" ~/oldboy_test.txt
I am oldboy teacher!
my blog is http://oldboy.blog.51cto.com

需求: 找出文件中oldboy 和 oldbey两个单词信息
[[email protected] ~]# egrep "(oldboy)|(oldbey)" ~/oldboy_test.txt
I am oldboy teacher!
my blog is http://oldboy.blog.51cto.com
my god ,i am not oldbey,but OLDBOY!
[[email protected] ~]# egrep "oldb(o|e)y" ~/oldboy_test.txt
I am oldboy teacher!
my blog is http://oldboy.blog.51cto.com
my god ,i am not oldbey,but OLDBOY!

进行后向引用前向的一个操作(sed)
[[email protected] ~]# echo "123456"|sed -r "s#(.*)#<\1>#g"
<123456>
[[email protected] ~]# echo "123456"|sed -r "s#(..)(..)(..)#<\1><\2><\3>#g"
<12><34><56>

企业实践应用:
01. 修改配置文件内容
[[email protected] ~]# grep "^S.*UX=" /etc/selinux/config
SELINUX=disabled
[[email protected] ~]# sed -rn "s#(^S.*UX=)#\1enforcing#g" /etc/selinux/config
[[email protected] ~]# sed -rn "s#(^S.*UX=)#\1enforcing#gp" /etc/selinux/config
SELINUX=enforcingdisabled
[[email protected] ~]# sed -rn "s#(^S.*UX=).*#\1enforcing#gp" /etc/selinux/config
SELINUX=enforcing
说明: 可以将替换命令放入到脚本中,从而实现快速部署操作

02. 批量修改文件名称(作业)
oldboy01.txt
oldboy02.txt
oldboy03.txt
oldboy04.txt
oldboy05.txt
oldboy06.txt
oldboy07.txt
oldboy08.txt
oldboy09.txt
oldboy10.txt
将以上文件扩展名修改为.jpg

d 括号符号:{}
指定花扩号前一个字符连续匹配多少次
* 连续匹配 0 次 或 多次
+ 连续匹配 1 次 或 多次
1) {n,m} n表示最少连续匹配多少次 m表示最多连续匹配多少次
[[email protected] oldboy_dir]# egrep "0{3,4}" ~/oldboy_test.txt
my qq num is 49000448.
not 4900000448.
[[email protected] oldboy_dir]# egrep "0{3,4}" ~/oldboy_test.txt -o
000
0000

2) {n} n表示只连续匹配n次
[[email protected] oldboy_dir]# egrep "0{3}" ~/oldboy_test.txt
my qq num is 49000448.
not 4900000448.
[[email protected] oldboy_dir]# egrep "0{3}" ~/oldboy_test.txt -o
000
000

3) {n,} n表示至少连续匹配n次,至多没有限制
[[email protected] oldboy_dir]# egrep "0{3,}" ~/oldboy_test.txt
my qq num is 49000448.
not 4900000448.
[[email protected] oldboy_dir]# egrep "0{3,}" ~/oldboy_test.txt -o
000
00000

4) {,m} m表示至多连续匹配n次,至少0次
[[email protected] oldboy_dir]# egrep "0{,3}" ~/oldboy_test.txt
I am oldboy teacher!
I teach linux.

I like badminton ball ,billiard ball and chinese chess!
my blog is http://oldboy.blog.51cto.com
our site is http://www.etiantian.org
my qq num is 49000448.

not 4900000448.
my god ,i am not oldbey,but OLDBOY!
[[email protected] oldboy_dir]# egrep "0{,3}" ~/oldboy_test.txt -o
000
000
00
[[email protected] oldboy_dir]# egrep "0{,4}" ~/oldboy_test.txt -o
000
0000
0

e 问号符号:?
* + {}
表示匹配问号前面一个字符出现0次或者1次
cat >>~/oldboy_test03.txt<<EOF
gd
god
good
goood
gooood
EOF

演示说明:
[[email protected] oldboy_dir]# grep "o*" ~/oldboy_test03.txt
gd
god
good
goood
gooood
[[email protected] oldboy_dir]# grep "o+" ~/oldboy_test03.txt
[[email protected] oldboy_dir]# egrep "o+" ~/oldboy_test03.txt
god
good
goood
gooood
[[email protected] oldboy_dir]# egrep "o?" ~/oldboy_test03.txt
gd
god
good
goood
gooood
[[email protected] oldboy_dir]# egrep "o?" ~/oldboy_test03.txt -o
o
o
o
o
o
o
o
o
o
o

原文地址:https://www.cnblogs.com/nsh123/p/12158719.html

时间: 2024-10-09 00:07:39

正则二的相关文章

2019.8.1正则二

预习 //去除str中的字母 var str = '1sss2aaa3sdsdf4sf5sd622'; str = str.replace(/[a-z]*/g,''); console.log(str); //查找a中出现最多的字符,打印次数 var a = 'aaaavvvvbbbdddbeeeddcccc'; for(var i = 0,result = [];i < a.length;i++){ //在result中有以a[i]为下标的元素,则给元素a[i]+1 if(result[a[i

js正则 (二)

// 正则 匹配规则//1)点字符(.)//点字符(.)匹配除回车(\r).换行(\n) .行分隔符(\u2028)和段分隔符(\u2029)以外的所有字符. //(2)位置字符//^ 表示字符串的开始位置//$ 表示字符串的结束位置// test必须出现在开始位置///^test/.test('test123') // true // test必须出现在结束位置///test$/.test('new test') // true // 从开始位置到结束位置只有test///^test$/.te

java 正则 二次转义

JAVA中的正则表达式“\\[([^\\]]+)\\]”这个表示什么意思?两个转义字符是为了表达什么? 正则表达式中“[”这样的字符有特殊的意义,所以需要写成“\[”.但是“\”本身也是具有特殊意义的转义字符. 所以“\[”就需要写成“\\[”.需要先对“\”进行一次转义 在正则中括号表示字符集,要表示中括号字符必须转义 整个正则匹配 中括号中的内容开头的\\[ 匹配" [ "字符尾部的\\]匹配 “]"字符中间的[([^\\]]+),表示所有非"]"字符

正则匹配div中的a标记的href 和content

        很久后又一次接触正则,那种似曾相似的感觉,你是不是也有这样的感觉,这么小CASE的东西,我一定要把他彻底掌握了,于是花时间看手册,于是就明白了,于是下次又是似曾相似-- 总写下今天用到的地方: //demo $str = '<div class="test"> <div class="wcb"><li>li</li> <a href="m.vip.com/shoe/47">

javascript toString数据类型检测

一.typeof 是一个一元运算符.检测数据类型,返回一个字符串,包含数据类型信息.例如:“number,string,undefined” 局限性: 1.typeof null ===> “object” 2.typeof []  ===>  "object" 不能具体检测对象数据类型的细分项(数组.正则...) 二.instanceof 检测某一个实例是否属于这个类 var ary = [1,2,3,4]; ary instanceof Array   //如果true

06_模块(二)_正则

1 sys 进度条实例 import sys import time def view_bar(num, total): rate = float(num) / float(total) rate_num = int(rate * 100) r = '\r%d%%' % (rate_num, ) # \r从起始位置重新开始 sys.stdout.write(r) # 不换行输出 sys.stdout.flush() # 清空输出内容 if __name__ == '__main__': for

R简单算术操作符&lt;函数和+-*/&gt;,缺失值,正则向量,向量运算&lt;索引&gt;(二)

赋值操作 x <- c(1,2,3); x = c(1,2,3); c(1,2,3) -> x; assign("x", c(1,2,3)); 这四种形式在大部分时候都能达到一致的效果.推荐使用第一种 1:向量的定义 一串有序数值构成的数值向量(vector) ,创建一个向量我们使用c(num1,num2,num3); 在 R 环境里面,单个的数值也是被看作长度为1的向量. 1.1 向量的基本运算 在算术表达式中使用向量将会对该向量的每一个元素都进行同样算术运算.出现 在同

shell正则表达二

shell正则表达 二部分 一.printf命令: 1. 格式化输出.(print  format) 2. 命令格式: printf'打印格式'实际内容 1. 打印格式: 1) \a(警告声音输出) 1) \b(退格键) 1) \n(输出新的一行) 1) \r(帧处于行的开始,即enter键) \t(水平的table键) 1) \v(垂直的table键) 1) \xNN(x为ASCII码十六进制表示:NN为俩位数数字:可转换数字成为字符) 1) %ns(n为数字:s代表string,即多少个字符

sed正则经典案例(二)

sed正则经典案例(二)    ###修改登记信息格式 已知文本内容如下: [[email protected] oldboy]# cat 2.txt  张三--1995/04/12--186-1233-4324--5004132131231231231 李四--1993/05/20--175-4323-2343--4423432423413132133 王五--1989/12/21--150-3123-3123--4324234121231231242 请替换成如下结果: 张三 1995041