咬文嚼字,颠倒糊涂,善哉!善哉?
念头通达,思虑有感,言简明,意通神
文件是什么?文本是什么?文本文件是什么?
好想来碗正常的豆腐脑,可惜每天早上也只能是豆腐花。吃不到,想想还是可以的,豆腐脑是“文件”,吃豆腐脑是“看文本”,找到地,点了豆腐脑,就是“查找文件”,符合个人口味的,加盐,加咸菜,加黄豆,加香菜,加卤汁,就是不同的豆腐脑了,有的人喜欢多加盐,有的人不要咸菜,还有的人喜欢黄豆,不同的人想要的豆腐脑都是不一样的呢?如何定制出符合自己的口味呢?定制出不同口味的过程,就是查找符合自己口味的豆腐“文件”的过程,多一勺卤汁的豆腐脑,叫它一汁豆腐脑( ^_^ ),不同的人,造就了不同口味的豆腐脑,接而产生了不同豆腐脑名字,虽然大的方面它还是叫豆腐脑,它还是叫文件,怎么找到符合自己口味的豆腐脑,就是怎么找到想要的文件,原理一模一样,只不过欠在表现手法上。计算机来源于生活。
不喜欢豆腐脑的直接看这里吧
文件的查找
限于目前水平可能有多漏简出,随着不断的学习,会不断的完善,此处只有通配符查找文件名,正则表达式查找文件名和文本
先说文件名的查找:
1、通过通配符查找
先创建一个文件,符合下边查找例子的文件
#touch happy.D.E.person
(可以读出来的话,我想说我是故意的)
通过ls列出当前目录下的任意字符串.任意一个字符.只有任意大小写字母的一个.任意字符串,有则列出,无则你懂得
#ls *.?.E.*
//注意此处是没有双引号,单引号,反向单引号的,通配符查找是不需要也不能要他么的
2、通过正则表达式查找:正则表达式的话目前就只知道用grep了查找文件名
#ls |grep ".*\..\.[[:alpha:]]\..*$"
ls 列出当前目录下的文件或文件夹,利用管道将ls列出的数据传入,grep查找符合后边正则表达式#regular expression 的文件或文件名。
任意的字符串.任意的一个字符.任意的大小写字母只有一个.任意的字符串
".*\..\.[[:alpha:]]\..*$"
双引号用来括起正则表达式
.*表示任意的字符串#注意与通配符*的区别
\.表示将.号转义#转成符号.人类认知的.号,而不是操作系统在正则表达式下认识的.号,因为正则表达式中的.号代表任意的一个字符
.代表任意的一个字符,注意和通配符?区别
[:alpha:]表示此处是任何的大小写字母皆可,但是请注意只能有一个,要想有多个比如happy.D.Ee.person就需要将[[:alpha:]]改为[[:alpha:]]\{,2\},本应该是[[:alpha:]]{,2},但是和上边的.一样,在正则表达式中{}不再是人类所认知的{}了,需要进行转义,转义用反斜杠,{,2}大括号用来表示前边的一个大写或小写字母至少出现两次{2,5}前边的一个大写或小写字母至少出现两次,最多出现5次{2,}前边的一个大写或小写字母至少出现两次,{2}前边的一个大写或小写字母必须出现两次即Ee
察觉到不一样了么?
文本的查找
文本,什么是文本,文件的本体,文件的内容。通常文件内容有很多,自己找起来很麻烦,太浪费时间,对文本查找方法应运而生,正则表达式,英文regular expression 规则表达式,内容遵循这种规则的表达式,用户定出这种规则,计算机按这种规则进行查找符合这种规则的东西。 linux中用grep等类似的具有查看文本功能的命令来让计算机找出用户自己想要的数据,既然是规则那么满足规则的内容都会被找出,如果没有不用说,注意按规则查找可能没有东西,可能只有一个,也可能有多个,正则表达式是所匹配到的是一个集合,而不会是一个符合规则的数据。
文本搜索工具,根据用户指定的文本模式(搜索条件)对目标文件进行逐行搜索,显示能匹配到的行。
语法格式:
grep [option]… ‘PATTERN’ FILE…
option选项,一条命令有多个选项,命令本身是为了做什么的,选项就是怎么做,做那一部分的问题,命令有点类似豆腐脑,而选项和调料差不多,有的人要盐多,有的要多加黄豆,有的人不要卤汁,这些盐,黄豆,卤汁就有点类似选项,不同的选项执行结果是不同的,但是总体上还是在完成查找的功能,还是再喝豆腐脑,接下来就是纯理论了,按思维的方式列出来,看的时候一定要全局观,即grep按照grep+选项(可写可不写)+正则表达式+文件名的方式工作,
再次理解一下正则表达式:是一类字符所书写的模式,其中许多字符不表示其字面意义,而是表达控制或通配等功能;
元字符:不表示其字面意义,而用于额外功能性描述
正则表达式:正则表达式引擎
基本正则表达式:grep
扩展正则表达式: egrep, grep -E
fgrep: fast, 不支持使用正则表达式
基本正则表达式的元字符:
字符匹配:
.: 匹配任意单个字符
[]: 匹配指定范围内的任意单个字符
[0-9], [[:digit:]]
[a-z], [[:lower:]]
[A-Z], [[:upper:]]
[[:space:]]
[[:punct:]]
[[:alpha:]]
[[:alnum:]]
[^]:
次数匹配元字符:用于实现指定其前面的字符所能够出现的次数
*: 任意长度,它前面的字符可以出现任意次
例如:x*y
xxy, xyy, y,
\?: 0次或1次,它前面的字符是可有可无的
例如:x\?y
xy, y, ay
\{m\}: m次,它前的字符要出现m次
例如:x\{2\}y
xy, xxy, y, xxxxy, xyy
\{m,n\}: 至少m次,至多n次
例如:x\{2,5\}y
xy, y, xxy
\{m,\}:至少m次
\{0,n\}: 至多n次
.*:任意长度的任意字符
工作于贪婪模式:尽可能多的去匹配
位置锚定:
^: 行首锚定;
写在模式最左侧
$: 行尾锚定:
写在模式最右侧
^$: 空白行
不包含特殊字符的连续字符组成的串叫单词:
\<: 词首,出现于单词左侧,\b
\<char
\>: 词尾,出现于单词右侧, \b
char\>
分组:
\(\)
例如:\(ab\)*
分组中的模式匹配到的内容,可由正则表达式引擎记忆在内存中,之后可被引用
引用:
例如\(ab\(x\)y\).*\(mn\)
有编号:自左而后的左括号,以及与其匹配右括号
\(a\(b\(c\)\)mn\(x\)\).*\1
\#: 引用第n个括号所匹配到的内容,而非模式本身
例如:
\(ab\?c\).*\1
bcmnaaa
abcmnabc
abcmnac
acxyac
命令选项:
-v: 反向选取
-o: 仅显示匹配的字串,而非字串所在的行
-i: ignore-case,忽略字符大小写
-E: 支持使用扩展正则表达式
God bless everything!
原创文章,作者:HGG,如若转载,请注明出处:http://www.178linux.com/77464