在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脚本编程大全
前言在shell脚本中成功运用sed编辑器和gawk程序的关键在于熟练使用正则表达式。这可不是件简单的事情,从大量数据中过滤出特定的数据可能会很复杂。下面将介绍如何在sed编辑器中创建正则表达式方式来过滤出需要的数据。字符组如果你想要限定待匹配的具体字符,这个时候就得使用字符组。可以定义用来匹配文本模式中某个位置的一组字符。如果字符组中的某个字符出现在了数据流中,那它就匹配了该模式。使用一...
正则表达式应用非常广泛,例如:php,Python,java等,但在linux中最常用的正则表达式的命令就是grep(egrep),sed,awk等,换句话 说linux三剑客要想能工作的更高效,就一定离不开正则表达式的配合。
1、什么是正则表达式?
简单的说,正则表达式就是为处理大量的字符串而定义的一套规则和方法。通过定义的这些特殊符号的辅助,系统管理员就可以快速过滤、替换或者输出需要的字符串。linux正则表达式一般以行为单位处理的。
2、为什么要学正则表达式
在企业工作中,我们每天做的linux运维工作中,时刻都会面对大量带有字符串的文本配置、程序、命令输出及日志文件等,而我们经常会有迫
sed 是 Linux/Unix 下处理文本的神器。一般情况下,sed 进行文本(字符)替换默认就支持了正则,这确实能为我们在很多时候带来巨大方便。
但有时候也可能遇到一些小麻烦。比如,我们要替换的字符串中本身包含了正则表达式的元字符(关键字符/保留字符,有正则的语义的字符,比如 ./*/?/^ 等)。
有的人可能会说了,直接对元字符进行转义就行了。没错,这...
对 {"code":200,"message":"操作成功","data": somedatas
这一行进行过滤,要求只留下前面的状态码200
为了考虑到区分不出哪些是正则表达式,哪些是过滤条件,先过滤一部分:
测试:echo '{"code":200,"message":"操作成功","data":' | sed 's/^.*code//g' | sed 's/message.*$//g'
执行上述语句,过滤结果是:":200,"
只留下200的过滤
很简单,只需要这么写表达式就行了
echo '{
这个命令的含义是:将每行中非数字的字符替换为空格,然后输出所有数字。其中,正则表达式`[^0-9]*`表示匹配0个或多个非数字字符。`&`表示匹配到的内容本身。`g`表示全局替换。
例如,假设/etc/passwd文件内容如下:
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
则执行上述sed命令后,输出结果为: