linux 正则表达式和grep命令

在linux中,因为一切都是文件,所以文本操作占有很大的比重,正则表达式是一门处理文本的强大的工具。

正则表达式用来识别文本,和匹配文件或者路径名的shell通配符比较相似。许多命令行工具都能提供对正则表达式的支持,其中grep是用得最多的工具。

grep的用法

grep   search_phrase   filename  

在filename表示的文件中查找包含search_phrase的文件。grep的主要选项如下:

选项作用
-i忽略大小写,查询文本不区分大小写
-v不匹配,反向作用。通常grep会打印包含查询文本的文件,加上改选项会打印不包含该文本的文件
-c打印匹配文件的数量
-l打印包含查询文本的文件名,而不是文本行默认是文本行

注:grep是根据文件的内容进行查找,会对文件的每一行按照给定的模式(pattern)进行匹配查找。和find结合使用的时候grep也是在find命令的输出的文件的内容中查找。


正则表达式

正则表达式和shell通配符一样也包含许多特殊字符,除了这些特殊字符之外其余的全是原义字符。

特殊字符

字符作用
^1.^在字符串开头时表示文本开头
2.^在[]中的第一个位置时表示否定,其他位置时是普通字符
$1.字符末尾
2.变量值获取
.任意单个字符
[]括号中的任意一个单个字符,特殊字符在[]中失去特殊含义(如\反斜),除了^和-在指定的位置时。]位于第一个位置时表示]是集合中的一个元素,不代表结束。
{}匹配特定的次数(重复)。在bash中还可以表示命令集合或者目录分隔。
-在[]中非第一个和最后一个位置时表示范围。具体的值和特定的语系有关。
?表示0个或一次(重复)。在shell中代表一个任意的字符。
*任意多次重复(重复)。在bash中代表任意长度的任意字符串。
+至少一次的重复(重复)
()分组符。在bash中表示子shell指定的命令。
|逻辑或。在bash中表示管道。
\转义字符,用于将元字符转义成普通字符和将普通字符转义成特殊字符。如:
换行符  \n
回车符  \r
制表符  \t

当我们在bash中传递包含元字符的正则表达式的时候,把特殊字符用单引号引起来至关重要,这样可以阻止 shell 试图展开它们。


下面就来解释一下语系与正则表达式[]范围的关系:

正则表达式是处理字串的表示方式,那么对字符的排序有影响的语系配置就会对正则表达式产生影响。

举例来说,英文和数字的编码顺序在en_US.utf8C 这两种语系的输出结果分别如下:
LANG=C:0 1 2 3 4 ... A B C D ... Z a b c d ...z
LANG=en_US.utf8:0 1 2 3 4 ... a A b B c C d D ... z Z

从上面可以发现不同的语系中字符的排序是不一样的。如果你想要获取大写的字符而使用[A-Z] 时,会发现LANG=C(或者POSIX)时是连续的大写字符。


但是如果使用en_US.utf8时,会发现会取出除了小写a以外的所有字母。因为排序的顺序是【A b B c C d D ... z Z】。


所以,使用这则表达式时,需要特别留意当时环境的语境是什么,否则会发现获取的结果和别人是不一样的。


修改语系

在linux中可以使用locale查看语系环境,语系配置文件是/etc/default/locale(ubuntu)或者/etc/sysconfig/i18n(centos)

  • 直接将LANG="POSIX" 或者LANG="C"(两者相同)
  • 然后直接source 配置文件

由于不同的语系对正则表达式,所以需要一个统一的表示方法来表示,下面这个符号在各语系下是一致的:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值