「这是我参与11月更文挑战的第15天,活动详情查看:2021最后一次更文挑战」
1.测验:
01.将输出的123456 --- <123456>
echo 123456 |sed -r 's#(.*)#<\1> #g'
02.将输出的123456 --- <123><456>
[root@fu ~]# echo 123456 |sed -r 's#(123)(456)#<\1><\2> #g'
<123><456>
03.将输出的123456 --- <12><34><56>
[root@fu ~]# echo 123456 |sed -r 's#(12)(34)(56)#<\1><\2><\3> #g'
<12><34><56>
04.将输出的123456 --- <56><12><34>
[root@fu ~]# echo 123456 |sed -r 's#(12)(34)(56)#<\3><\1><\2> #g'
<56><12><34>
2.{} --- 指定前面一个字符连续出现了多少次,可以更加灵活的指定 {n,m} --- 指定前面一个字符连续至少出现n次,最多连续出现了m次
{} --- 指定前面一个字符连续出现正好n次
[root@fu ~]# egrep '0{2}' oldboy.txt
my qq num is 49000448
not 4900000448
[root@fu ~]# egrep '0{2}' oldboy.txt -o
00
00
00
{n,} --- 指定前面一个字符连续出现正好n次,最多出现多少次没有限制
[root@fu ~]# egrep '0{1,}' oldboy.txt
my qq num is 49000448
not 4900000448
[root@fu ~]# egrep '0{1,}' oldboy.txt -o
000
00000
{,4} --指定前面一个字符连续出现次数不限,最多出现4次
[root@fu ~]# egrep '0{,4}' oldboy.txt -o
000
0000
0
[root@fu ~]# egrep '0{,4}' oldboy.txt
I am oldboy teacher!
3. 匹配前一个字符0次或者1次
总结匹配前一个字符次数 --- 匹配 0次 或者 1次
[root@fu ~]# egrep 'go?d' oldboy_test.txt
gd
* --- 匹配 0次 或者 1次 或者 多次
[root@fu ~]# egrep 'go*d' oldboy_test.txt
gd
good
goood
goooood
+ --- 匹配 1次 或者 多次
[root@fu ~]# egrep 'go+d' oldboy_test.txt
good
goood
goooood
{n,m} --- 至少匹配n次最多m次
[root@fu ~]# egrep 'go{3,10}d' oldboy_test.txt
goood
goooood
{n} --- n次
[root@fu ~]# egrep 'go{3}d' oldboy_test.txt
goood
总结:括号家族系列总结 [] 作用:指定多个要匹配的字符信息 a b c 0 9 中括号中的每一个字符==元素 [0-9] [a-z] [A-Z] () 作用:将分散字符汇总成一个整体,进行匹配 I am o (ld)boy sed命令指定一个整体信息,利用sed的替换能力,实现后项引用前项 {} 作用: 01.通配符:做为一个序列符号使用{1..10} {1,3,5} {1,2}{3,4} 02.扩展正则:更加灵活的匹配前一个字符连续出现的次数 {n,m} {n} {n,}{,m}
终极总结:引号说明
'' 所见即所得
"" 类似单引号,有些符号信息会被解析 ! $ 环境变量名称 $()
没有引号 类似于双引号,但是可以支持通配符号 {1..10}
[root@fu ~]# echo "`hostname` $(LANG) $(pwd) {1..3}"
-bash: LANG: command not found
fu /root {1..3}
[root@fu ~]# echo `hostname` $(LANG) $(pwd) {1..3}
-bash: LANG: command not found
fu /root 1 2 3
`` 执行命令,把命令执行结果交给外面命令进行处理
正则使用常见的问题:
1) 匹配一行从头到m字符的信息
grep '^.*m' oldboy.txt
贪婪特性:默认都是从左(开头)到右开始
2) ^d和*d之间的区别
正则符号:用于匹配文件内容信息 grep sed awk
通配符号:用于匹配文件名称信息 find ls
正则符号学习与帮助方法
利用手册: man grep/sed/awk
info grep/sed/awk(更加详细)
官方资料:http://www.gnu.org/software/grep/manual/
正则表达式特性说明
1)正则表达式具有贪婪匹配特性
终极目标一:
oldboy.txt
赵 11010519906096418
钱 11010519806096418
孙 11011998606096418
王 11011019860609641x
冯 oldboy
魏 oldgirl
[root@fu ~]# vim oldgirl
[root@fu ~]# egrep "[0-9]+" oldgirl
赵 11010519906096418
钱 11010519806096418
孙 11011998606096418
王 11011019860609641x
终极目标二:模拟在一个文件中写入一个电话号码
如果不是电话号码,就进行报错提示提示"格式不正确"
如果是电话号码,就提示输入正确
[root@fu ~]# echo 100000000000 >check_number.txt
[root@fu ~]# egrep '[0-9]+' check_number.txt
100000000000
[root@fu ~]# echo adadda >check_number.txt
[root@fu ~]# egrep '[0-9]+' check_number.txt
[root@fu ~]# egrep '[0-9]+' check_number.txt && echo "input"|| echo "fromat error"
fromat error
[root@fu ~]# echo 100000000000 >check_number.txt
[root@fu ~]# egrep '[0-9]+' check_number.txt && echo "input"|| echo "fromat error"
100000000000
input
基础正则表达式符号分类说明:
^ 尖角符号 描述 表示搜索出以什么字符开头的行信息
实践 #grep "^m" oldboy.txt
$ 美元符号 描述 表示搜索出以什么字符结尾的行信息
实践 #grep "m$" oldboy.txt
^$ 空行符号 描述 表示搜索出空行信息;表示把空行排除
实践 #grep -n "^$" oldboy.txt
. 单点符号 描述 代表且只能代表一个字符/文本/符号(不匹配空行)
会进行贪婪匹配
实践 #grep -n "^$" oldboy.txt
\ 转义符号 描述 转义符号/符号,让有特殊含义的字符脱掉马甲,显出原形
转义符号/符号,让有特殊含义的字符穿上马甲,变化妆容
实践 \n 匹配一个换行符
\b 单词边界,\bcool\b 匹配cool,不匹配 coolant
\r 匹配回车
\t 匹配一个横向制表符
* 星号符号 描述 重复之前的一个文本或字符连续出现0个或多个
实践 #grep "o*" oldboy.txt
.* 点星符号 描述 匹配所有字符/文本,包含空行信息
^.*以任意多个字符开头:.*4 以任意多个字符结尾
实践 #grep ".*" oldboy.txt
正则符号
实践 #grep "^.*o" oldboy.txt
.^$ 组合符号 描述 表示从一行什么位置开头到结束的内容都过滤出来
实践 #grep "m.*$" oldboy.txt
[] 括号符号 描述 匹配字符集合的任意一个字符,例如[abc],表示a或b或c;
[a-z] 匹配所有小写字母
[A-Z] 匹配所有大写字母
[0-9] 匹配所有数字字符