在“[]“中可以有以下几种形式,每种形式的含义如后所述。
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.根据需求,希望能灵活应用通配符”[]”达到目标
此次笔记记录完毕。