您的位置:首页 > 运维架构 > Shell

shell 脚本 正则表达式通配符之 "[]" [大三TJB_708]

2012-11-08 11:54 816 查看
在“[]“中可以有以下几种形式,每种形式的含义如后所述。



1.[list]

匹配list中的任意单一字符,只要文件中此行包含list中的某一字符都会被匹配。

<1>例regular_expression.sh



图1.regular_expression.sh脚本


[f#]作用:匹配for_read.c文件中包含字符’f’和’#’的行。
<2>for_read.c内容



图2.for_read.c文件内容
<3>运行regular_expressiom.sh脚本后将for_read.c中包含’f’或’#’的行输出到屏幕上,顺序按照for_read,c中的顺序输出。



图3.regular_expression.sh脚本运行结果

2.[^list]

匹配除list字符外的其它字符。
<1>例:regular_expression.sh



图4.regular_expression.sh脚本
<2>运行脚本得到结果



图5.regular_expression.sh脚本运行结果
可见,for_read.c中的内容全部被输出。这是因为for_read.c中第一行除了包含字符串”#include”之外,还有” <stdio.h>”,故匹配到不含’[#include]’任意其它字符的内容。
<3>修改脚本如下



图6.regular_expression.sh脚本
运行结果:



图7.regular_expression.sh脚本运行结果
可见,for_read.c中的第一行内容全被正则表达式’[^#include <stdio.>]’所屏蔽。

<4>总结
<1>用[^list]时,若文件中除包含list内容还有其它,则照样会被匹配。
<2>使用[list]或[^list]时,最好是用’ [list]’或‘[^list]’,避免报错(如使用”grep [#include <stdio.h>] for_read.c”语句运行脚本时报错:./regular_expression.sh: line 3: stdio.h:没有那个文件或目录)

在"[]"中使用‘-’。

3.[a-z]

字符范围。匹配指定范围内的任意字符。
这个简单,只要文件字符串中包含”a-z”中的任意字符就会被匹配。

4.[^a-z]

负值字符范围。匹配任何不在指定范围内的任意字符。
<1>例:regular_expression.sh



图8.regular_expression.sh脚本
<2>运行脚本得到结果



图9.regular_expression.sh脚本运行结果
见图9,for_read.c中的每一行内容都被输出来。这是因为在每一行中都有不属于’a-z’的字符(如:’<’、’(’、’{’、’;’),这是这些不属于正则表达式中的字符被匹配中而被输出。

5.a[abc]b

首先,文件中要包含字符串”axb”,a和b之间只能有一个字符,若此字符属于“[]”内的某个字符,则包含字符串”axb”的行将会被匹配,’x’为‘a’或’b’或‘c’。

6.a[^abc]b

首先被匹配的行要包含ayb,且y不为’a’且不为’b’且不为’c’时,这一行将被选中。
<1>例regular_expression,sh



图10.regular_expression.sh脚本
<2>运行脚本得结果



图11.regular_expression.sh脚本运行结果
<3>分析
首先for_read.c中只有第一行包含了字符串”iyc”,其次字符’y’不属于正则表达式”[cl]”中的任意字符。所以此行被匹配而被输出。

7.根据需求,希望能灵活应用通配符”[]”达到目标

此次笔记记录完毕。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: