正则表达式一一字符组

前言

在shell脚本中成功运用sed编辑器和gawk程序的关键在于熟练使用正则表达式。这可不是件简单的事情,从大量数据中过滤出特定的数据可能会很复杂。下面将介绍如何在sed编辑器中创建正则表达式方式来过滤出需要的数据。

字符组

如果你想要限定待匹配的具体字符,这个时候就得使用字符组。可以定义用来匹配文本模式中某个位置的一组字符。如果字符组中的某个字符出现在了数据流中,那它就匹配了该模式。
使用一个方括号来定义一个字符组。方括号中包含所有你希望出现在该字符组中的字符。然后你可以在模式中使用整个组,就跟使用其他通配符一样。

不说多了,下面是个创建字符组的例子:

vim data.txt

The cat is sleeping.
That is a very nice hat.
This is another test line.
at ten o'clock we'll go home.

匹配结果:
sed -n ‘/[ch]at/p’ data1.txt

The cat is sleeping.
That is a very nice hat.

匹配这个模式的单词只有cat和at。还要注意以at开头的行也没有匹配。字符组中必须有字符来匹配相应的位置。

而字符组有一个功能就是,在不确定某个字符的大小写时,字符组会非常有用。

echo "Yes" | sed -n '/[Yy]es/p'

在这里插入图片描述

echo "yes" | sed -n '/[Yy]es/p'

在这里插入图片描述
可以在单个表达式中用多个字符组

echo "Yes" | sed -n '/[Yy][Ee][Ss]/p'

在这里插入图片描述

正则表达式使用3个字符组来涵盖了3个字符位置含有大小写的情况。字符组不必只含有字母,也可以在其中使用数字。

vim data2.txt

This line doesn't contain a number.
This line has 1 number on it.
This line has a number 2 on it.
This line has a number 4 on it.
sed -n '/[0123]/p' data2.txt 

匹配结果:
在这里插入图片描述
这个正则表达式模式匹配了任意含有数字0,1,2或3的行。含有其他数字以及不含有数字的行都会被忽略掉。

可以将字符组组合在一起,以检查数字是否具备正确的格式,比如电话号码和邮编。但当你尝试匹配某种特定格式时,必须小心。这里有个匹配邮编出错的例子:
在这里插入图片描述

sed -n '/[0-9][0-9][0-9][0-9][0-9]/p' data3.txt

在这里插入图片描述
这个结果出乎意料。它成功过滤掉了不可能是邮编的那些短的数字。因为最后一个字符组没有字符可匹配。

解决办法为:如果要确保只匹配五位数,就必须匹配的字符和其他字符分开,要么用空格,要么像这个例子中,指明它们在行首和行尾。

sed -n '/^[0-9][0-9][0-9][0-9][0-9]$/p' data3.txt

在这里插入图片描述

总结

正则表达式在Linux实用工具、编程语言以及采用了正则表达式引擎的应用程序中均有实现。在Linux中有一些不同的正则表达式引擎。最流行的两种是POSIX基础正则表达式(BRE)引擎和POSIX扩展正则表达式引擎。sed编辑器基本符合BRE引擎。

参考:Linux命令行与shell脚本编程大全

发布了71 篇原创文章 · 获赞 42 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/chen1415886044/article/details/103448268