正則表達式

  1. 語系對正則表達式的影響
    LANG=C時:0 1 2 3 4 … A B C D … Z … a b c d … z
    LANG=zh_CN時:0 1 2 3 4 … a A b B c C d D …z Z
    所以使用正則表達式的時候,要特別注意,當時的環境,否則可能會發現與別人的選取結果不一樣。
    爲了避免編碼造成的英文與數字選取問題,因此有些特殊符號我們需要了解。
    參數 含義
    [:alnum:] 代表英文大小寫字符及數字,即0-9,A-Z,a-z
    [:alpha:] 代表任何英文大小寫字符,即A-Z,a-z
    [:blank:] 代表空格鍵與TAB鍵
    [:cntrl:] 代表鍵盤上面的控制鍵,即包括CR,LF,Tab,Del等
    [:digit:] 代表數字,即0-9
    [:graph:] 除了空格符外其他所有按鍵
    [:lower:] 代表小寫字符,即a-z
    [:print:] 代表任何可以被打印出來的字符
    [:punct:] 代表標點符號,即" ’ ? ! ; : # $
    [:upper:] 代表大寫字符,即A-Z
    [:space:] 代表會產生空白的字符,包括空白鍵tab和CR
    [:xdigit:] 代表十六進制的數字類型,因此包括0-9,A-F,a-f的數字與字符
  2. grep的高級參數
    參數 含義
    -A 後面接數字,是after的意思,除了列出搜尋出的這一行,後面n行也要列出
    -B 後面加數字,是before的意思,除了列出該行外,前面n行也要列出
    –color=auto 可將正確的那個選取數據列出顏色
    [root@www~]# dmesg | grep 'eth'
    eth0:RealTek RTL8139 at 0xee846000, 00:90:cc:a6:34:84,IRQ 10
    eth0:Identified 8139 chip type 'RTL-8139C'
    eth0:link up,100Mbps,full-duplex.lpa,0xC5E1
    eth0:no IPv6 routers present
    <==dmesg可以列出內核產生的信息,通過grep來選取網卡相關的信息。
    
    grep在數據中查找一個字符串時,是以整行爲單位進行數據選取的。如果想讓grep默認使用顏色高亮關鍵字,那麼可以在~/.bashrc內加上alias grep=‘grep --color=auto’
  3. 利用中括號老查找集合字符
    如果想要查找test和taste可以發現他們有共同的t?st存在
    [root@www~]# grep -n 't[ae]st' regular_express.txt
    8:I can't finish the test
    9:Oh!The soup taste good
    
    在中括號中,無論有幾個字母,都代表1個,並且字母與字母之間是或的關係。
    如果我們需要有oo的字符,但是oo前面沒有g
    [root@www~]# grep -n '[^g]oo' regular_express.txt
    2:apple is my favorite food.t
    3:Football game is not use feet only
    
    當我們不需要oo前面有小寫字符的
    [root@www~]# grep -n '[^a-z]oo' regular_epress.txt
    5:However,this dress is about $ 3183 dollars.
    15:You are the best is mean you are the no.1.
    
  4. 行首與行尾字符^$
    • 如果想要查詢以什麼開頭的,就用^製表符
      如果想要查詢一行字符以the開頭的
      [root@www~]# grep -n '^the' regular_express.txt
      12:the symbol '*' is represented as start
      
      如果不想要開頭是英文字母的
      [root@www~]# grep -n '^[^a-zA-Z]' regular_express.txt
      1:"Open Source" is a good mechanism to develop programs
      21:# I am VBird
      
    • 如果想要查詢以什麼結尾,就用$
      如果要找出行尾結束爲小數點.的一行
      [root@www~]# grep -n '\.$' regular_express.txt           <==這裏需要注意小數點具有其他意義,所以必須用轉義字符
      1:"Open Source" is a good mechanism to develop programs.
      2:apple is my favorite food.
      
      想要找到哪一行是空白行
      [root@www~]# grep -n '^$' regular_express.txt
      
  5. 任意一個字符.與重複字符*
    • 小數點代表一定有一個任意字符的意思
    • 星號代表重複前一個0到無窮多次的意思,爲組合形態
    [root@www~]# grep -n 'g..d' regular_rxpress.txt     <==代表搜索g與d之間有兩個字符的行
    1:"Open Spurce" is a good mechanism to develop programs.
    19:Oh!The soup taste good.
    16:The world <Happy> is the same with "glad".
    
     [root@www~]# grep -n 'ooo*' regular_express.txt     <==代表搜索有兩個o的字符的行。*代表*前面的字符含有0個或者0個以上
     1:"Open Source" is a good mechanism to develop programs.
     2:apple is my favorite food.
     19:goooooogle yes!
    
  6. 限定連續RE字符範圍
     grep -n 'o\{2\}' regular_express.txt             <==代表篩選出包含兩個及以上連續o的字符的行
     grep -n 'go\{2,5\}' regular_express.txt        <==代表篩選出包含2個到5個連續o的字符的行,並且第一個o前面是g
     grep -n  'go\{2,\}' regular_express.txt         <==代表篩選出兩個以上的連續o的字符的行,並且第一個o前面是g
     #在{}裏面如果有逗號,代表以上,沒有逗號代表X及以上
    
  7. sed工具
    範例:sed [-nefr] 動作
    注意:動作需要
    參數 含義
    -n 使用安靜模式,一般情況下,所有來自STDIN的數據一般都會被列出到屏幕上,但如果加上-n參數,則只有經過sed特殊處理那一行纔會被列出
    -e 直接在命令行模式下進行sed的動作編輯
    -f 直接將sed動作寫在一個文件內,-f filename 可以執行filename內的sed動作
    -r sed動作支持的是擴展型正則表達式的語法,-f filename則可以執行filename內的sed動作
    -i 直接修改讀取的文件內容,而不是由屏幕輸出
    動作說明:[n1[,n2]] function
    n1,n2是可選的參數,代表進行動作的行數,舉例,如果動作需要在10到20行進行,則"10,20 [動作行爲]"
    function參數 含義
    a 新增,a的後面接字符串,而這些字符串會在新的一行出現
    c 替換,c的後面接字符串,這些字符串可以替換n1,n2之間的行
    d 刪除,因爲是刪除,所以d後面通常不接參數
    i 插入,i的後面可以接字符串,而這些字符串會在新的一行出現(目前的上一行)
    p 打印,也就是將某個選擇的數據打印出來,通常p參數與參數sed -n 一起運行
    s 替換,可以直接進行替換工作,通常這個s的動作可以搭配正則表達式,如1,20s/old/new/g
    • 以行爲單位的新增/刪除功能
      [root@www~]nl /etc/passwd | sed '2,5d'        <==將/etc/passwd的內容列出來並打印行號,同時將2-5行刪除
      [root@www~]nl /etc/passwd | sed '2d'          <==將/etc/passwd的內容列出來並打印行號,同時將第2行刪除
      [root@www~]nl /etc/passwd | sed '2,$d'        <==將/etc/passwd的內容列出來並打印行號,同時將第2行到最後一行刪除
      
      [root@www~]ml /etc/passwd | sed '2a drink tea'      <==在第二行最後加上drink tea字樣
      [root@www~]ml /etc/passwd | sed '2a drink tea or ......\drink bear'             <==反斜槓的作用就是換行,在第二行增加了drink tea之後換行,增加drink bear,也就是原來的第三行變成了第四行            
      
    • 以行爲單位的替換與顯示功能
      [root@www~]nl /etc/passwd | sed '2,5c No 2-5 number'      <==把第二行到第五行替換爲No 2-5 number
      [root@www~]nl /etc/passwd | sed -n '2,7p'                 <==只打印2到7行,-n參數的用處是安靜模式,如果不加-n參數,那麼2到7行會重複輸出
      
    • 部分數據的查找並替換功能
      除了整行的處理模式之外,sed還可以用行爲單位進行數據的查找並替換的功能。
      sed的查找與替換sed 's/要被替換的字符串/新字符串/g'
      舉例子:
      [root@www~]# /sbin/ifconfig eth0 | grep 'inet addr'
      inet addr: 192.1.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0 <==想只要ip地址,需要把addr前面的刪除,再把Bcast後面的刪除
      [root@www~]# /sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g'
      192.1.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0     <==去掉了addr前面一部分
      [root@www~]# /sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g' | sed 's/Bcast.*$//g'
      
    • 直接修改文件內容
      sed加上-i參數可以直接修改文件內容。
       [root@www~]# sed -i '$a # This is a test' regular_express.txt
       <==$代表最後一行,所以這命令意思是在最後一行新增
      
  8. 基礎正則表達式
    RE字符 含義
    word 查找的word在行首,例子grep -n ‘^#’ regular_express.txt 代表以#開頭
    ord$ 查找的字符串在行尾,例子grep -n ‘!$’ regular_express.txt 代表以!結尾
    . 代表一定有一個任意字符,例子grep -n ‘e.e’ regular_express.txt 代表e與e之間有一個字符
    \ 轉義字符,把特殊符號的特殊意義去掉
    * 重複零到無窮多個的前一個字符,例子grep -n ‘ee*’ regular_express.txt 代表至少有1個e
    [list] 從字符集合中選出想要選取的字符,例子grep -n ‘g[ld]’ regular_express.txt 代表有gl或者gd的行
    [n1-n2] 從字符集合的RE字符中找出想要選取的字符範圍,例子grep -n ‘[0-9]’ regular_express.txt代表含任意數字的行
    [^list] 從字符集合的RE字符裏面找到不要的字符串或者範圍,例子grep -n ‘oo[^t]’ regular_express.txt 代表不要含有oot的行
  9. 擴展正則表達式
    grep僅支持基礎正則表達式,如果要使用擴展正則表達式,需要用grep -E 或者egrep
    RE字符 含義
    + 重複一個或一個以上的前一個RE字符,例子egrep -n ‘go+d’ regular_express.txt 代表god good goood等等
    ? 零個或一個RE字符,例子egrep -n 'go?d’代表gd 或者god
    | 用或的方式找出數個字符串,例子egrep -n ‘gd|good’ regular_express,txt 代表找出有gd或者good的行
    () 找出"組"字符串,例子egrep -n -n ‘g(la|oo)d’ regular_express.txt 查找含有gla或者good的行
    ()+ 多個重複組的判定,例子egrep ‘A(xyz)+C’ 查找以A開頭,以C結尾,中間含有一個以上xyz的字符串的行
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章