标签:数字 匹配 div 扩展 内容 怎样 单引号 忽略 kkk
我们还是从一道面试题说起。
请从test.txt文件当中过滤出正确的的身份证号码
[root@localhost test.dir]# cat test.txt
赵 370831199405162458
钱 370831199305162kjl
孙 37083119920516245X
李 37083110516245887k
张 37083KKKKKKK990516
在LINUX当中,我们要过滤文本时,我们一定要搞清楚,要过滤的文本有什么特征,那么问题来了,身份证号有什么特征?
好,那事情就简单了!
我们先来满足第一个要求,即身份证号都是18位,18位!如何用正则表达式表示呢?其实无法用基本的正则表达式表达18位数字,需要用到扩展的正则表达式,即:{18};第二个要求就有点麻烦了,最后一位是什么不确定,最后一位要么是数字要么是大写的X,“或”的关系,或的关系用扩展的正则表达式如何表达呢?要用到"|"这个符号,前面的17位数字倒是容易了,数字通过[0-9]就可以表示了。
好,注意了,来了啊!两种方法都可以:
[root@localhost test.dir]# egrep ‘[0-9]{18}|[0-9]{17}X‘ test.txt 赵 370831199405162458 孙 37083119920516245X
#查找有18位数字的或者前17位是数字最后一位是X的行,把完全是数字的号码与数字X混杂的号码分开考虑
[root@localhost test.dir]# egrep ‘[0-9]{17}[0-9X]{1}‘ test.txt 赵 370831199405162458 孙 37083119920516245X
#查找前17位是数字后面跟一位数字或大写的X的行,把完全是数字的号码与数字X混杂的号码放在一起考虑
好,现在增加难度!现在文件变成这样了:
[root@localhost test.dir]# cat test.txt 赵 370831199405162458 钱 370831199305162kjl 孙 39083119920516245X 陈 37083119920516245X377 李 37083110516245887k 张 37083KKKKKKK990516 [root@localhost test.dir]# egrep ‘[0-9]{18}|[0-9]{17}X‘ test.txt 赵 370831199405162458 孙 39083119920516245X 陈 37083119920516245X377 #出现了这个,不符合我们的需求 #为什么不符合要求呢?因为这这一行明显是超过了18位的要求 [root@localhost test.dir]# egrep ‘[0-9]{17}[0-9X]{1}‘ test.txt 赵 370831199405162458 孙 39083119920516245X 陈 37083119920516245X377 #出现了这个,不符合我们的需求
怎么办呢?我们怎样才能只过滤出18位的呢?可以这样,如下所示:
[root@localhost test.dir]# egrep ‘[0-9]{18}|[0-9]{17}X‘ test.txt -w #对egrep使用-w选项 赵 370831199405162458 孙 39083119920516245X [root@localhost test.dir]# egrep ‘[0-9]{17}[0-9X]{1}‘ test.txt -w 赵 370831199405162458 孙 39083119920516245X
-w是什么意思呢?即锚定连续的字符,即锚定单词,仔细体会一下!
grep做为文本三剑客之一,其作用就是用来过滤文本,与单引号匹配,我们在使用grep的时候最好都使用单引号。
它有以下这么几个常用的选项,我们要做简要的描述,然后再举详细的例子
下面就是例子了:
[root@localhost test.dir]# cat test.txt 赵 370831199405162458 钱 370831199305162kjl 孙 39083119920516245X 陈 37083119920516245X377 李 37083110516245887k 张 37083KKKKKKK990516 [root@localhost test.dir]# grep -n ‘1993‘ test.txt #显示行号 2:钱 370831199305162kjl [root@localhost test.dir]# grep -o ‘1993‘ test.txt #只显示匹配到的字符,不显示一整行 1993 [root@localhost test.dir]# grep -nv ‘1993‘ test.txt #取反 1:赵 370831199405162458 3:孙 39083119920516245X 4:陈 37083119920516245X377 5:李 37083110516245887k 6:张 37083KKKKKKK990516 [root@localhost test.dir]# grep -Ew ‘[0-9]{18}|[0-9]{17}X‘ test.txt #-E和-w连用,能看懂吗?不懂再去看看上面的例子哦! 赵 370831199405162458 孙 39083119920516245X [root@localhost test.dir]# grep -E ‘[k]{7}‘ test.txt #用小写的K,啥都过滤不出来 [root@localhost test.dir]# grep -Ei ‘[k]{7}‘ test.txt #使用了-i选项之后,忽略了大小写,就能把下面这一行过滤出来了。 张 37083KKKKKKK990516 [root@localhost test.dir]# grep -EB2 ‘[K]{7}‘ test.txt #把目标内容的上面的两行过滤出来 陈 37083119920516245X377 李 37083110516245887k 张 37083KKKKKKK990516
标签:数字 匹配 div 扩展 内容 怎样 单引号 忽略 kkk
原文地址:https://www.cnblogs.com/yizhangheka/p/11705014.html