咬文嚼字,顛倒糊涂,善哉!善哉?
念頭通達,思慮有感,言簡明,意通神
文件是什么?文本是什么?文本文件是什么?
好想來碗正常的豆腐腦,可惜每天早上也只能是豆腐花。吃不到,想想還是可以的,豆腐腦是“文件”,吃豆腐腦是“看文本”,找到地,點了豆腐腦,就是“查找文件”,符合個人口味的,加鹽,加咸菜,加黃豆,加香菜,加鹵汁,就是不同的豆腐腦了,有的人喜歡多加鹽,有的人不要咸菜,還有的人喜歡黃豆,不同的人想要的豆腐腦都是不一樣的呢?如何定制出符合自己的口味呢?定制出不同口味的過程,就是查找符合自己口味的豆腐“文件”的過程,多一勺鹵汁的豆腐腦,叫它一汁豆腐腦( ^_^ ),不同的人,造就了不同口味的豆腐腦,接而產生了不同豆腐腦名字,雖然大的方面它還是叫豆腐腦,它還是叫文件,怎么找到符合自己口味的豆腐腦,就是怎么找到想要的文件,原理一模一樣,只不過欠在表現手法上。計算機來源于生活。
不喜歡豆腐腦的直接看這里吧
文件的查找
限于目前水平可能有多漏簡出,隨著不斷的學習,會不斷的完善,此處只有通配符查找文件名,正則表達式查找文件名和文本
先說文件名的查找:
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.www58058.com/77464