13.linux 文件搜索工具——基本正则表达式:
1 linux上文本处理三剑客:
使用grep、egreg和fgreg进行文本过滤;其中preg执行基本的模式匹配功能(选项-E/-F),而egreg同样执行模式匹配但提供了额外的功能(选项-E/-F);而fgreg不具备执行模式匹配的功能
sed :stream editor ,流编译器;文本编译工具
awk :linux上的实现为gawk,文本报告生成器(格式化文本)
2 正则表达式:
基于一类特殊字符和普通文本字符构建的模式,在其中某些字符并未直接体现其原本的意义而被用来执行控制或匹配功能的作用
1)分两类:基本正则表达式;扩展正则表达式
2)基本正则表达式元字符:字符匹配,匹配次数,位置锚定,分组及引用
正则分类:
| 基础正则 | ^ $ . * .* [] [^] | |
|---|---|---|
| 扩展正则 | + () ? |
通配符和正则:
| 区别 | 处理目标不同 | 支持的命令不同 |
|---|---|---|
| 通配符 | 文件/目录 文件名 处理的是参数 | Linux大部分命令都可以使用 |
| 正则 | 进行过滤,在一个文件中查找内容, 处理的是字符 | Linux三剑客;开发语言python,Golang,java |
3 字符匹配:
. 匹配人以单个字符;
[] 匹配指定范围内的任意单个字符;
[^] 匹配指定范围外的任意单个字符;脱字符
The text consists of several symbols representing different character categories in Markdown syntax, including numeric characters, lowercase letters, uppercase letters, all alphabets, and alphanumeric combinations.
[:punct:] 所有标点符号 [:space:] 空格
举例:grep "r[[:alpha:]][[:alpha:]]t" /etc/passwd rt中间匹配两个字母
4 匹配次数:
在指定字符出现频率的位置标记符后面使用,用于限定该字符前面字符的最大允许数量;默认采用贪婪匹配模式。
- 匹配其前面的字符任意次;0,1,多次;例如:grep "x*y"
.* 匹配任意长度的任意字符
? 匹配其前面的字符0次或1次;即其前面的字符是可有可无的;
+ 匹配前面的字符1次或多次;即前面的字符要出现至少一次;
精确次数匹配:
{m} 匹配其前面的字符m次;例如 grep "x{1}y"
{m,n} 匹配其前面的字符至少m次,至多n次
{0,n} 至多n次
{m,} 至少m次
5 位置锚定:
^ 行首锚定;用于模式的最左侧;脱字符
$ 行尾锚定;用于模式的最右侧;
^PATTERN$ 用于PATTERN来匹配整行;
^$ 空白行
^[[:space:]]*$ 空行或包含空白字符的行
单词:非特殊字符组成的连续字符(字符串)都成为单词:
< 或 \b 词首锚定,用于单词模式的左侧;例如:"<rooot"
> 或 \b 词尾锚定,用于单词模式的右侧;例如:"root>"
<PATTERN>\ 匹配完整的单词; 例如:"<root>"
并且的命令:+
6 \ 转义字符:脱掉马甲打回原形,去除原有特殊含义
· 匹配出文件以 . 结尾的行:grep '.$' 文件名
7 分组及引用:
将一个或者多个字符捆绑在一起,当作是一个整体进行处理;
xy*ab 命令行中括号有特殊意义所以用转义符 \
分组标记中的元素会被正则表达式引擎自动捕获并存储在内部的变量里,并且这些捕获项将被命名为:
\1: Starting from the left, the pattern between the first left parenthesis and its corresponding right parenthesis matches the characters in question.
通常用".*\1"
\2:在正则表达式中,在第一个左括弧及其对应的右括弧之间所定义的模式所匹配到的字符。
\3:从左边开始计算起始位置后,在第3个左括号及其对应的右边括号之间的那个模式中所指的那个字符;
……
括号可以嵌套不能交叉
经典的例子:找到前后一致的单词,例如同事 love 或者同事 like (l..e)
当使用grep命令运行' l..e.*l..e'并应用于love.txt时(原文:如果grep "l..e.*l..e" love.txt 发现四句都可以出现要求前后一样的),识别为四个连续的句子均满足要求前后一致的情况(原文:发现四句都可以出现要求前后一样的),则应采用分组括号来进行模式匹配。(原文:此时就需要使用分组括号中的模式匹配)

后向引用:引用前面的分组括号中的模式所匹配到的字符
