[学习]Linux RE

来源:互联网 发布:手机禁网软件 编辑:程序博客网 时间:2024/06/05 22:15

本文,记录学习Linux RE(正则表达式)的过程,强调使用场合。所以下面直接采用命令+用途的形式解析

学习资料
《鸟哥》12章

什么是RE?
为了确保以后复习是正确的,原话贴出。
正则表达式就是处理字符串的方法,它是以行为单位来进行字符串的处理行为,正则表达式通过一些特殊符号的辅助,可以让用户轻易达到查找、删除、替换某特定字符串的处理程序。

语系对RE的影响?
由于不同语系的编码数据并不相同,所以就会造成数据选取结果的区别。(字符都以01表示)

可避免语系造成的问题,下面是鸟哥网站上的表格截取。
特殊符号的表格。
特殊符號代表意義[:alnum:]代表英文大小寫字元及數字,亦即 0-9, A-Z, a-z[:alpha:]代表任何英文大小寫字元,亦即 A-Z, a-z[:blank:]代表空白鍵與 [Tab] 按鍵兩者[:cntrl:]代表鍵盤上面的控制按鍵,亦即包括 CR, LF, Tab, Del.. 等等[:digit:]代表數字而已,亦即 0-9[:graph:]除了空白字元 (空白鍵與 [Tab] 按鍵) 外的其他所有按鍵[:lower:]代表小寫字元,亦即 a-z[:print:]代表任何可以被列印出來的字元[:punct:]代表標點符號 (punctuation symbol),亦即:" ' ? ! ; : # $...[:upper:]代表大寫字元,亦即 A-Z[:space:]任何會產生空白的字元,包括空白鍵, [Tab], CR 等等[:xdigit:]代表 16 進位的數字類型,因此包括: 0-9, A-F, a-f 的數字與字元

以下练习都是
  1. 使用鸟哥的regular_express.txt来操作。
  2. 使用grep命令实现(支持RE)
  3. 使用sed加以练习(支持RE)

grep命令工具

查找特定字符串
  1. grep -n 'the' 显示行数
  2. grep -v 'the'反向选择
  3. grep -i 'the'忽略大小写

利用中括号[]来查找集合字符
  1. grep -n 't[ae]st' []下选择ae的其中一个
  2. grep -n '[^g]oo' []下的反向选择g
  3. grep -n '[^a-z]oo' []下的反向选择字母小写
  4. grep -n '[^a-z]oo' []下的反向选择字母小写(排除语系干扰)

行首与行尾字符^$
注意:引入“制表符”的概念和使用
  1. grep -n '^the' 行首为the字符串
  2. grep -n '^[a-z]' 行首为字母小写
  3. grep -n '^[^a-zA-Z]' 行首为非字母大小写
  4. grep -n '\.$' 行尾为.(小数点有特殊函数,需使用转义字符\加以解析)
    1. 理解windows下的“断行符”与Linux的区别
    2. 利用cat -An来显示文本的全部信息(-A显示文本行的$结束符)
    3. head -n 10 | tail -n 6显示文本的5-10行(理解数据在|运算中的传递)
  5. grep -n '^$'寻找空白行(提醒:-v方向,常用于排除,节省版面)

任意一个字符.与重复字符*
.(小数点):代表一定有一个任意字符的意思
*(星号):代表重复前一个0到无穷多次的意思,为组合形态
  1. grep -n 'g..g'找出g??g,共四个字符的字符串
  2. grep -n 'ooo*'找出至少含所有两个o以上,前两个oo是确保了至少,后面的o*则是寻找可有可无的配对
  3. grep -n 'goo*g'同理2
  4. grep -n 'g.*g'寻找g...g,.*确保一定有一个任意子符,然后由*去寻找是否有0或多个任意一个字符
  5. grep -n '[0-9][0-9]*' 等同于 grep -n '[0-9]'

限定连续RE字符范围{}(花括号)
\转移字符:使用转移字符令shell环境下的某符号失去其特殊意义
  1. grep -n 'o\{2\}'找到2个o的字符串,等价于grep -n 'oo'
  2. grep -n 'go\{2,5\}g'寻找g开头,2到5个o,g结尾的字符串
  3. grep -n 'go\{2,\}g'寻找g开头,2个以上o的字符串

基础正则表示法字符整理
RE 字符意義與範例^word意義:待搜尋的字串(word)在行首!
範例:搜尋行首為 # 開始的那一行,並列出行號
grep -n '^#' regular_express.txt
word$意義:待搜尋的字串(word)在行尾!
範例:將行尾為 ! 的那一行列印出來,並列出行號
grep -n '!$' regular_express.txt
.意義:代表『一定有一個任意字元』的字符!
範例:搜尋的字串可以是 (eve) (eae) (eee) (e e), 但不能僅有 (ee) !亦即 e 與 e 中間『一定』僅有一個字元,而空白字元也是字元!
grep -n 'e.e' regular_express.txt
\意義:跳脫字符,將特殊符號的特殊意義去除!
範例:搜尋含有單引號 ' 的那一行!
grep -n \' regular_express.txt
*意義:重複零個到無窮多個的前一個 RE 字符
範例:找出含有 (es) (ess) (esss) 等等的字串,注意,因為 * 可以是 0 個,所以 es 也是符合帶搜尋字串。另外,因為 * 為重複『前一個 RE 字符』的符號, 因此,在 * 之前必須要緊接著一個 RE 字符喔!例如任意字元則為 『.*』 !
grep -n 'ess*' regular_express.txt
[list]意義:字元集合的 RE 字符,裡面列出想要擷取的字元!
範例:搜尋含有 (gl) 或 (gd) 的那一行,需要特別留意的是,在 [] 當中『謹代表一個待搜尋的字元』, 例如『 a[afl]y 』代表搜尋的字串可以是 aay, afy, aly 即 [afl] 代表 a 或 f 或 l 的意思!
grep -n 'g[ld]' regular_express.txt
[n1-n2]意義:字元集合的 RE 字符,裡面列出想要擷取的字元範圍!
範例:搜尋含有任意數字的那一行!需特別留意,在字元集合 [] 中的減號 - 是有特殊意義的,他代表兩個字元之間的所有連續字元!但這個連續與否與 ASCII 編碼有關,因此,你的編碼需要設定正確(在 bash 當中,需要確定 LANG 與 LANGUAGE 的變數是否正確!) 例如所有大寫字元則為 [A-Z]
grep -n '[A-Z]' regular_express.txt
[^list]意義:字元集合的 RE 字符,裡面列出不要的字串或範圍!
範例:搜尋的字串可以是 (oog) (ood) 但不能是 (oot) ,那個 ^ 在 [] 內時,代表的意義是『反向選擇』的意思。 例如,我不要大寫字元,則為 [^A-Z]。但是,需要特別注意的是,如果以 grep -n [^A-Z] regular_express.txt 來搜尋,卻發現該檔案內的所有行都被列出,為什麼?因為這個 [^A-Z] 是『非大寫字元』的意思, 因為每一行均有非大寫字元,例如第一行的 "Open Source" 就有 p,e,n,o.... 等等的小寫字
grep -n 'oo[^t]' regular_express.txt
\{n,m\}意義:連續 n 到 m 個的『前一個 RE 字符』
意義:若為 \{n\} 則是連續 n 個的前一個 RE 字符,
意義:若是 \{n,\} 則是連續 n 個以上的前一個 RE 字符!
 範例:在 g 與 g 之間有 2 個到 3 個的 o 存在的字串,亦即 (goog)(gooog)
grep -n 'go\{2,3\}g' regular_express.txt


sed命令工具
[dmtsai@study ~]$ sed [-nefr] [動作]選項與參數:
-n  :使用安靜(silent)模式。在一般 sed 的用法中,所有來自 STDIN 的資料一般都會被列出到螢幕上。
      但如果加上 -n 參數後,則只有經過 sed 特殊處理的那一行(或者動作)才會被列出來。
-e  :直接在指令列模式上進行 sed 的動作編輯;
-f  :直接將 sed 的動作寫在一個檔案內, -f filename 則可以執行 filename 內的 sed 動作;
-r  :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 就是啦!


以行为单位的新增/删除功能
  1. nl file | sed '2,5d'删除2到5号内容
    1. nl以行为单位,写出到stand out,并添加行号
  2. nl file | sed '2a drink tea'第二行后,添加drink tea字符串
  3. nl file | sed '2i drink tea'第二行前,添加drink tea字符串
  4. 增加多行,每一行都以\为分割,并以’最后结束增加操作

以行为单位的替换与显示功能
  1. nl file | sed '2,5c no 2-5 number'将2-5行替换为no 2-5 number
  2. nl file | sed -n '2,5p'直接打印2到5行
  3. nl file | sed '2,5p'并非如你所愿地打印出2到5行,而是重复打印了2-5行
  4. ifconfig | grep 'inet''[^inet6]' | sed 's/inet//g' | sed 's/net.*$//g'
    1. grep 针对多个字符串进行RE处理
    2. sed替换句法
    3. .*$的连用效果

直接修改文件内容
  1. sed -i (危险操作)
  2. 该文件非常大(100W行),仅修改100行,使用vim打开(可能崩溃)

稍作总结
  1. grep与sed都以行为单位
  2. grep强调查找
  3. sed强调处理



0 0
原创粉丝点击