sed能直接識別的RE

2021-04-09 01:27:20 字數 4672 閱讀 3536

小弟在sed使用中,對正規表示式有幾個地方犯迷糊,為了徹底弄明白,試驗之……

特將結果呈與各位,請師兄們批評指正!也讓初學者少走彎路。

雖說有些問題在明白之後,感覺很簡單,貼出來好像沒必要;但在明白之前,的確很讓人糊塗,所以還是決定貼出來。

[color=blue]in basic regular expressions the metacharacters ?, +, 。

+ 匹配前面的子表示式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等價於 。

? 匹配前面的子表示式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等價於 。

n是乙個非負整數。匹配確定的n次。例如,'o' 不能匹配"bob"中的'o',但是能匹配"food"中的兩個o。

n 是乙個非負整數。至少匹配n 次。例如,'o' 不能匹配 "bob" 中的 'o',但能匹配 "foooood" 中的所有 o。

m 和 n 均為非負整數,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o" 將匹配 "fooooood" 中的前三個 o。'o' 等價於 'o?'。請注意在逗號和兩個數之間不能有空格。

/d 匹配乙個數字字元。等價於 [0-9]。

/d 匹配乙個非數字字元。等價於 [^0-9]。

/w 匹配包括下劃線的任何單詞字元。等價於'[a-za-z0-9_]'。

/w 匹配任何非單詞字元。等價於 '[^a-za-z0-9_]'。

[/color]

ps:linux 9 +sed-4.0.5-1

$ cat text 

1* 1+

1? 1.

^1 1$

1{}

1 1

1 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/p'

原理同上

$ cat text |sed -n '/1/p'

原理同上

$ cat text |sed -n '/1/p'

原理同上

$ cat text |sed -n '/1()/p'

原理同上

$ cat text |sed -n '/1//p'

在轉義之後,{} 在sed中具有 正規表示式限定符 功能,故顯示兩個及以上 1 的行。

$ cat text |sed -n '/1//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'

[color=red]1[/color]

1111

不過我不明白為何會跑出第一行?難道是我的機器有毛病???因為/1[0-9]/與中的 「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

但是 [color=red]$ cat text |sed -n '/boy/d/p'

$ cat text |sed -n '/boy/d//p'

卻都沒有顯示,/d 不是等價於 [0-9] 。這裡為甚麼沒顯示?

/d /d /w /w 在使用時我還沒有找到竅門,還請各位指教![/color]

[color=green]本人測試後,發現:

/w  在sed中好像只等價於'[a-za-z_]' 

/w 在sed中好像只等價於'[^a-za-z_]'

/d  在sed中等價於'd'

/d  在sed中等價於'd'

/s 在sed中等價於's'

/s 在sed中等價於's'[/color]

$ 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 的行進行顯示。

[color=blue]小結:

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 」

[/color]

大家快來砸磚吧! :em06:

轉貼http://www.chinaunix.net/jh/24/393964.html

sed實現直接修改檔案內容

sed是實現對流的編輯。通常,我們使用sed可以實現內容的編輯後然後儲存成另外的乙個檔案,如果正確的話,才寫入到原始檔。但是某些時候,我們需要直接修改檔案,因為,儲存檔案到乙個檔案,然後再覆蓋原檔案的辦法顯得很麻煩。其實很簡單,只需要乙個 i 引數就可以了。比如,我想替換檔案中的 propertie...

sed實現直接修改檔案內容

sed是實現對流的編輯。通常,我們使用sed可以實現內容的編輯後然後儲存成另外的乙個檔案,如果正確的話,才寫入到原始檔。但是某些時候,我們需要直接修改檔案,因為,儲存檔案到乙個檔案,然後再覆蓋原檔案的辦法顯得很麻煩。其實很簡單,只需要乙個 i 引數就可以了。比如,我想替換檔案中的 propertie...

sed直接替換檔案內容

sed i s zhangsan lisi g grep zhangsan rl modules 解釋一下 i 表示inplace edit,就地修改檔案 r 表示搜尋子目錄 l 表示輸出匹配的檔名 這個命令組合很強大,要注意備份檔案。1 sed y 1234567890 abcdefghij te...