1. 程式人生 > >linux下練習正則表示式

linux下練習正則表示式

1.什麼是正則表示式

在做文書處理或編寫程式時,用到查詢、替換等功能,使用正則表示式能夠簡單快捷的完成目標。簡單而言,正則表示式通過一些特殊符號的幫助,使使用者可以輕鬆快捷的完成查詢、刪除、替換等處理程式。例如grep, expr, sed , awk. 或 Vi 中經常會使用到正則表示式,為了充分發揮 shell 程式設計的威力,需要精通正則表示式。正規表示法基本上是一種『表示法』, 只要工具程式支援這種表示法,那麼該工具程式就可以用來作為正規表示法的字串處理之用。 也就是說,例如 vi, grep, awk ,sed 等等工具,因為她們有支援正規表示法, 所以,這些工具就可以使用正規表示法的特殊字元來進行字串的處理。

首先是正則表示式的特殊符號:
[:alnum:]代表英文大小寫字母及數字 
[:alpha:]代表英文大小寫字母
[:blank:]代表空格和 tab 鍵
[:cntrl:]鍵盤上的控制按鍵,如 CR,LF,TAB,DEL
[:digit:]代表數字
[:graph:]代表空白字元以外的其他
[:lower:]小寫字母
[:print:]可以被打印出來的任何字元
[:punct:]代表標點符號
[:upper:]代表大寫字元
[:space:]任何會產生空白的字元如空格,tab,CR 等
[:xdigit:]代表 16 進位的數字型別
例項:找出檔案中的所有大寫字母
$ grep -n '[[:lower:]]' regular_express.txt

2.語系對正則表示式的影響

  • ANG=C 時: 0 1 2 3 4....ABCDE...Zabcde...z
  • LANG=zh_CN 時:0 1 2 3 4...aAbBcCdD.....zZ

在使用正則表示式[A-Z]時, LANG=C 的情況下,找到的僅僅是大寫字元 ABCD..Z。而在 LANG=zh_CN 情況下,會選取到 AbBcCdD.....zZ 字元。因此在使用正則表示式時要特別留意語系。

由於我們一般使用的相容與 POSIX 的標準,因此使用 C 語系。


3.grep命令與正則表示式

1.搜尋特定字串“the”:

引數說明:
-a :將 binary 檔案以 text 檔案的方式搜尋資料
-c :計算找到 '搜尋字串' 的次數
-i :忽略大小寫的不同,所以大小寫視為相同
-n :順便輸出行號
-v :反向選擇,亦即顯示出沒有 '搜尋字串' 內容的那一行!
$ grep -n 'the' regular_express.txt
$ grep -in 'the' regular_express.txt

2.字串匹配

[]中包含的任意一個字元。只能是一個。
字元“ - ”來表示一個範圍
[^...] 排除型字元組。排除後面的字元

[abc]           :表示“a”或“b”或“c”
[0-9]           :表示 0~9 中任意一個數字,等價於[0123456789]
[\u4e00-\u9fa5] :表示任意一個漢字
[^a1<]          :表示除“a”、“1”、“<”外的其它任意一個字元
[^a-z]          :表示除小寫字母外的任意一個字元

查詢“tast”或者“test”兩個字串。
# grep -n 't[ae]st' regular_express.txt 

查詢不包含“#”的字串
# grep -n '[^#]' regular_express.txt
$ grep -n 'oog' regular_express.txt
$ grep -n '[^g]oog' regular_express.txt 
$ grep -n '[^go]oog'regular_express.txt

行首符號:^

$ grep -n '^the' regular_express.txt
查詢行首為大寫字母的所有行:
# grep -n '^[A-Z]' regular_express.txt

行尾符號:$

查詢以 d 字母結尾的行:
# grep -n 'd$' regular_express.txt
查詢空行:
$ grep -n '^$' regular_express.txt
檢視/etc/insserv.conf 文件
'^$' : 過濾掉空白行
'^#' :過濾掉註釋行(以#號開頭)
$ cat -n /etc/insserv.conf
$ grep -v '^$' /etc/insserv.conf | grep -v '^#'


3.任意一個字元:.  重複字元:* 查詢 a?ou?型別的字元。
$ grep -n 'a.ou.' regular_express.txt
*(星號):代表重複前面 0 個或者多個字元。
e*: 表示具有空字元或者一個以上 e 字元。
ee*,表示前面的第一個 e 字元必須存在。第二個 e 則可以是 0 個或者多個 e 字元。
eee*,表示前面兩個 e 字元必須存在。第三個 e 則可以是 0 個或者多個 e 字元。
ee*e :表示前面的第一個與第三個 e 字元必須存在。第二個 e 則可以是 0 個或者多個 e 字元。



4.限定連續字元的範圍{}
{ }可限制一個範圍區間內的重複字元數。舉個例子,若要找出 2~5 個 o 的連續字串,如何做? 此時便要用到{}了。由於 { 與 } 在 shell 中有特殊意義,需要用到轉義字元\。

查詢連續的兩個 o 字元:

$ grep -n 'o\{2\}' regular_express.txt
總結:
^word    表示帶搜尋的字串(word)在行首
word$    表示帶搜尋的字串(word)在行尾
.(小數點) 表示 1 個任意字元
\        表示轉義字元,在特殊字元前加\會將特殊字元意義去除
*        表示重複 0 到無窮多個前一個 RE(正則表示式)字元
[list]   表示搜尋含有 l,i,s,t 任意字元的字串
[n1-n2]  表示搜尋指定的字串範圍,例如[0-9] [a-z] [A-Z]等
[^list]  表示反向字串的範圍,例如[^0-9]表示非數字字元,[^A-Z]表示非大寫字元範圍
\{n,m\}  表示找出 n 到 m 個前一個 RE 字元
\{n,\}   表示 n 個以上的前一個 RE 字元

4.正則表示式運用之sed工具命令

通過正則表示式和 sed 工具簡單快捷的完成檔案查詢、修改等功能。
sed工具介紹: sed 是非互動式的編輯器。它不會修改檔案,除非使用 shell 重定向來儲存結果。預設情況下,所有的輸出行都被列印到螢幕上。

sed 編輯器逐行處理檔案(或輸入),並將結果傳送到螢幕。具體過程如下:首先 sed 把當前正在處理的行儲存在一個臨時快取區中(也稱為模式空間),然後處理臨時緩衝區中的行,完成後把該行傳送到螢幕上。sed 每處理完一行就將其從臨時緩衝區刪除,然後將下一行讀入,進行處理和顯示。處理完輸入檔案的最後一行後,sed 便結束執行。sed 把每一行都存在臨時緩衝區中,對這個副本進行編輯,所以不會修改原檔案。

如果要修改原檔案,可使用-i 選項。

1.將 regular_express.txt 的內容列出並列印行號,同時,將 2-5 行刪除顯示:
$ nl regular_express.txt | sed '2,5d'

注: sed 是 sed -e 的簡寫, 後接單引號 2.刪除第三行到最後一行, $定位到最後一行
刪除第三行到最後一行, $定位到最後一行
3.原檔案中刪除第 1 行
$ sed -i '1d' regular_express.txt


4.在第二行後新增 test 字串
$ nl regular_express.txt | sed '2a test'


5.在第二行前新增 test 字串
$ nl regular_express.txt | sed '2i test'


6.在第二行後加入兩行 test,“\n”表示換行符
$ nl regular_express.txt | sed '2a    test\ntest'


7.替換
$ nl regular_express.txt | sed '2,5c No2-5number'


8.列出需要的幾行
$ nl regular_express.txt |sed -n '5,7p'


9.替換字串
sed 's/被替換字串/新字串/g'

5.擴充套件正則表示式

事實上,一般實驗者只需要熟悉基礎的正則表示式就足夠了。不過有時候為了簡化命令操作,瞭解一些使用範圍更廣的擴充套件表示式,會更加方便。

簡單對比:
$ grep -v '^$' regular_express.txt |grep -v '^#'
$ egrep -v '^$|^#' regular_express.txt



+ :表示重複一個或一個以上的前一個 RE 字元
$ egrep -n 'go+d' regular_express.txt
$ grep -n 'goo*d' regular_express.txt
god    good



() :表示找出群組字串
$ egrep -n 'g(la|oo)d' regular_express.txt
也就是搜尋(glad)或 good 這兩個字串





相關推薦

linux練習表示式

1.什麼是正則表示式 在做文書處理或編寫程式時,用到查詢、替換等功能,使用正則表示式能夠簡單快捷的完成目標。簡單而言,正則表示式通過一些特殊符號的幫助,使使用者可以輕鬆快捷的完成查詢、刪除、替換等處

LinuxPOSIX表示式API使用

一、概述 在Linux環境中,經常使用正則表示式,如grep、sed、find等等,目前正則表示式有2中不同的標準,分別是Perl標準和POSIX標準,這2種風格,大體相同,稍有差別。在 C/C++的標準庫均不支援表示式,不過在C++11標準中,貌似引入了boost的正則庫,在Li

Linux命令- grep +表示式

一、簡介: grep (global search regular expression(RE) and print out the line,全面搜尋正則表示式並把行打印出來)是一種強大的文字搜尋工具,它能使用正則表示式搜尋文字,並把匹配的行打印出來。Unix的grep家族包括grep、egr

限制QLineEdit的數值輸入範圍(QT表示式方法),順便簡單介紹QT表示式方法

首先看幾個例子: 1.限制浮點數輸入範圍為[-180,180] QRegexp rx("^-?(180|([1-9]?[0-9]|1[0-7][0-9])(\\.\\d)?)$"); QRegExpValidator *pReg = new QRegExpV

windos編譯表示式庫pcre

最近寫東西用到正則表示式到網上找了一大圈沒有發現好的,因為我用的是c++而且不想用ATL。最終發現c寫的pcre挺好而且權威,php和python都用的它。 言歸正轉下面說一下windows下編譯pcre的步驟: 2.下載完之後新建一個lib後者dll工程之後把pcre-

linux,如何在C語言中使用表示式(整理)

  一個正則表示式的教程可以參看(裡面有個測試正則表示式的工具)      正則表達是用來匹配字串的好東東。       如果使用者熟悉Linux下的sed、awk、grep或vi,那麼對正則表示式這一概念肯定不會陌生。由於它可以極大地簡化處理字串時的複雜度,因此現 在已

Linux 用bash shell表示式批量處理檔案的應用例項

程式碼檔案頭有版本資訊,下面一段shell指令碼就是用來收索和更新程式碼頭註釋裡面的斑斑資訊的。 從中可以到shell指令碼中以下幾個小技術點是如何運用的: 1. 利用正則表示式分組匹配指定內容 2. 字串的定位,截斷和拼接處理 3. 指定檔案指定行替換指定內容 #!/bi

linuxshell 程式設計之擴充套件表示式

1. ‘+’ 限定字元 +限定符表示前面字元至少出現一次或者多次。與*不同在於0次或者多次 2. '?' 限定符 ?限定前面的字元最多出現一次。即出現0次或者1次 3. 數線 |和圓括號() 例如

Linux-表示式-反選練習

練習文字如下,儲存為test.txt Archive: drgeo-oneclick.zip Length Method Size Ratio Date Time CRC-32 Name -------- ------ -------

linux,如何在C語言中使用表示式

使用POSIX函式庫中的Regex系列函式來說明在Linux c下如何使用正則表示式 #include <stdio.h> #include <sys/types.h> #include <regex.h> #include <st

linux 利用ls grep 和表示式實現目錄和檔案的分開顯示

要列出當前目錄下所有的檔名和目錄名直接使用ls命令即可。但如何只列出檔名而不列出目錄呢?查遍了ls 的幫助,也沒看到有這個現成的選項。幸好這個問題還是比較常見的,網上已經有了一些解答,但實驗之後,我發現看到的幾個連結給出的解決方法都是不完全正確的。具體如下。一、網上流傳的解

linuxc/c++例項之五表示式字串匹配

一、簡介        標準的C和C++不支援正則表示式,但有一些函式庫可以輔助C/C++程式設計師完成這一功能。正則表示式常用函式:編譯正則表示式 regcomp()、匹配正則表示式 regexec()、釋放正則表示式 regfree()。 二、詳解 1、程式碼 re

Linux表示式的使用及grep工具

正則表示式 規定一些特殊語法表示字元類、數量限定符和位置關係,然後用這些特殊語法和普通字元一起表示一個模式。 字元類 例如: 匹配電話號碼的正則表示式:1[3578][0-9]{9}。 表示第一位是1,第二位是3、5、7、8中的一個,後面9位都

獲得某個資料夾的符合表示式的檔案地址

根據使用者需求列出某個資料夾下所有滿足的檔案地址    思路:      1.獲得使用者需要查詢的資料夾和對檔名稱的需求(正則表示式)          使用

3分鐘搞定Linux系統表示式

正則表示式是一種字元模式,用於在查詢過程中匹配製定的字元。   元字元通常在Linux中分為兩類:Shell元字元,由Linux Shell進行解析; 正則表示式元字元,由vi/grep/sed/awk等文字處理工具進行解析; 正則表示式一

js表示式驗證字串只包括大小寫字母劃線和-

背景說明 在之前的開發過程中為了校驗一個欄位只含有大小寫字母,下劃線和-花費了不少力氣才搞定,想著趕快寫一篇部落格來記錄下來,日後開發一定會遇到!! 程式碼實現 首先定義一個變數用來存放驗證字串的正則表示式:var regex=/^[A-Za-z0-9_\-]+$/ig;

只能輸入英文數字和劃線和橫線的表示式

var reg="^[A-Za-z0-9-_]+$"  ; var regus = new RegExp(regs); regus.test("所要驗證的字串")  true 符合 false 不符合     中英文

[一天幾個linux命令] shell指令碼之表示式

shell指令碼之正則表示式 原文連結:Linux–shell指令碼之正則表示式 概念及特點 概念 正則表示式是對字串操作的一種邏輯公式,就是用事先定義好的一些特定的字元、及這些特定字元的組合,組成一個"規則字串",這個"規則字串"用來表達對字串的一種過濾邏輯。規定一些特殊語

表示式的學習和練習

正則表示式通常被用來檢索、替換那些符合某個模式(規則)的文字。是用正則表示式來完成郵箱,賬號的驗證可以省去繁雜的邏輯,用更少的程式碼完成更復雜的事務。 通過學習我大致把當前學習的常見的字元分為四種: 1,預定義字元類 .:任何字元 \d : 數字[0-9]

Linux使用者組和許可權管理及表示式

1、複製/etc/skel目錄為/home/tuser1,要求/home/tuser1及其內部檔案的屬組和其他使用者沒有任何訪問許可權。 [[email protected] ~]# cp -a /etc/skel /home/tuser1 [[email protected] ~]#