sed識別regular expression

小弟在sed使用中,對正則表達式有幾個地方犯迷糊,爲了徹底弄明白,試驗之……
特將結果呈與各位,請師兄們批評指正!也讓初學者少走彎路。
雖說有些問題在明白之後,感覺很簡單,貼出來好像沒必要;但在明白之前,的確很讓人糊塗,所以還是決定貼出來。

In basic regular expressions the metacharacters ?, +, {, |,  (,  and  ) lose  their  special  meaning; instead use the backslashed versions /?, /+, /{, /|, /(, and /).
---以上來自man grep 中的REGULAR EXPRESSIONS


正則表達式中的限定符:
*        匹配前面的子表達式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等價於{0,}。
+        匹配前面的子表達式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等價於 {1,}。
?        匹配前面的子表達式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等價於 {0,1}。
{n}        n是一個非負整數。匹配確定的n次。例如,'o{2}' 不能匹配"Bob"中的'o',但是能匹配"food"中的兩個o。
{n,}        n 是一個非負整數。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。
{n,m}        m 和 n 均爲非負整數,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 將匹配 "fooooood" 中的前三個 o。'o{0,1}' 等價於 'o?'。請注意在逗號和兩個數之間不能有空格。

/d        匹配一個數字字符。等價於 [0-9]。
/D        匹配一個非數字字符。等價於 [^0-9]。
/w        匹配包括下劃線的任何單詞字符。等價於'[A-Za-z0-9_]'。
/W        匹配任何非單詞字符。等價於 '[^A-Za-z0-9_]'。


PS:linux 9 +sed-4.0.5-1
$ cat text
1*
1+
1?
1.
^1
1$
1{}
1{0,}
1{1,}
1{1,10}
1()
1[]
1[a-z]
1[^a-z]
1[a-z$]
1111
222222
1a
1bb
1//
aaa aa aa
boy/gire/people
boy3gire5people
boy4gire9people
x|y
aab|cddd
212
21/
t/w
t/W
y/d
y/D

$ cat text |sed -n '/1*/p'
將顯示text所有內容,因爲sed能直接識別正則表達式符號 * ,/1*/ 意思是與包括1和不包括1的所有行匹配。

$ cat text |sed -n '/1/*/p'
僅顯示 1* 這一行, * 在轉義之後只是一個普通字符。

$ cat text |sed -n '/1+/p'
僅顯示 1+ 這行,因爲sed並不能直接識別 + ,只是把它當作一個普通字符。

$ cat text |sed -n '/1/+/p'
顯示所有含一個及以上 1 的行, + 在轉義後,成爲正則表達式。

$ cat text |sed -n '/1?/p'
僅顯示 1?  這行,因爲sed並不能直接識別正則表達式符合 ? ,只是把它當作一個普通字符。

$ cat text |sed -n '/1/?/p'
顯示所有的行,/1/?/ 與包括1和不包括1的所有行均匹配。

$ cat text |sed -n '/1./p'
顯示所有含1的行,因爲sed能直接識別正則表達式符號“ . ” 。

$ cat text |sed -n '/1/./p'
僅顯示匹配 1.  的這行,“ . ”在轉義後僅是一普通字符。

$ cat text |sed -n '/^1/p'
顯示所有以 1 開頭的行,因爲sed能直接識別正則表達式符合 ^ 。

$ cat text |sed -n '//^1/p'
顯示 ^1 這一行, ^ 在轉義後僅是一普通字符。

$ cat text |sed -n '/1$/p'
顯示所有以 1 結尾的行,因爲sed能直接識別正則表達式符號 $ 。

$ cat text |sed -n '/1/$/p'
顯示 1$ 這一行, $ 在轉義後僅是一普通字符。

$ cat text |sed -n '/1{}/p'
僅顯示 1{} 這一行,因爲sed並不能直接識別正則表達式符合{}。
$ cat text |sed -n '/1{1,}/p'
原理同上
$ cat text |sed -n '/1{1,10}/p'
原理同上
$ cat text |sed -n '/1{0,}/p'
原理同上
$ cat text |sed -n '/1()/p'
原理同上

$ cat text |sed -n '/1/{2,/}/p'
在轉義之後,{} 在sed中具有 正則表達式限定符 功能,故顯示兩個及以上 1 的行。
$ cat text |sed -n '/1/{0,/}/p'
原理同上,顯示所有含1及不含1 的行。

$ cat text |sed -n '/1[]/p'
報錯“sed: -e expression #1, char 6: Unterminated address regex”,因爲sed能直接識別正則表達式符號 [] ,但 [] 中間卻爲空,沒有相關集合(字母或數字),故錯。

$ cat text |sed -n '/1/[/]/p'
顯示 1[] 這一行, []在轉義後僅是普通字符。

$ cat text |sed -n '/1[0-9]/p'
1{1,10}
1111
不過我不明白爲何會跑出第一行?難道是我的機器有毛病???因爲/1[0-9]/與{1,10}中的 “10”匹配!

$ cat text |sed -n '/1[^0-9]/p'
顯示出所有含1 ,並且 1 後面非數字的行。

$ cat text |sed -n '/boy/gire/people/p'
無顯示。因爲sed不知道 /g /p 是什麼,找不到匹配的東東! :D

$ cat text |sed -n '/boy//gire//people/p'
顯示包含 boy/gire/people 的這一行,第一個/ 把緊隨的 / 轉義成普通字符。

$ cat text |sed -n '/boy[0-9]/p'
boy3gire5people
boy4gire9people

但是
$ cat text |sed -n '/boy/d/p'
$ cat text |sed -n '/boy/d/{1/}/p'
卻都沒有顯示,/d 不是等價於 [0-9] 。這裏爲甚麼沒顯示?
/d /D /w /W 在使用時我還沒有找到竅門,還請各位指教!

本人測試後,發現:
/w  在sed中好像只等價於'[A-Za-z_]'
/W 在sed中好像只等價於'[^A-Za-z_]'
/d  在sed中等價於'd'
/D  在sed中等價於'D'
/s 在sed中等價於's'
/S 在sed中等價於'S'


$ cat text |sed -n '/b|c/p'
顯示 aab|cddd 這一行。sed把 | 當作普通字符。
$ cat text |sed -n '/x|y/p'
顯示 x|y 這一行。sed把 | 當作普通字符。

$ cat text |sed -n '/aab/|212/p'
aab|cddd
212
|在轉義之後表示 “或”的功能,對匹配aab 或 212 的行進行顯示。

小結:
sed中可直接使用的RE:
*  .  ^  $  [  ]  /  c
/w ( 相當於[A-Za-z_] )  /W ( 相當於[^A-Za-z_] )
sed中需轉義使用的RE:
+  ?  {  }  (  )  |  <  >
其他:
/d (d)  /D (D)  /s (s)  /S (S)
匹配 單引號’ 用雙引號
匹配 反引號` 用單引號
/b 匹配單詞的前或後邊界 ( 字符[^A-Za-z0-9_]均構成單詞邊界 )
/B 匹配單詞的非邊界 ( 字符[^A-Za-z0-9_]均構成單詞邊界 )
/< 匹配單詞的位置前 ( 字符[^A-Za-z0-9_]均構成單詞邊界 )
/> 匹配單詞的位置後 ( 字符[^A-Za-z0-9_]均構成單詞邊界 )
支持十進制,格式爲“/d + 兩位或三位十進制數”,如“/d065 或/d65 均代表字符 A ”
支持十六進制,格式爲“/x + 兩位十六進制數”,如“/x61 代表字符 A ”
支持八進制,格式爲“/o + 兩位或三位八進制數”,如“/o077 或/o77 均代表字符 ?,/o101代表字符 A ”

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章