2013-03-19 29 views
9

我試過幾乎所有的東西(我猜)但沒有任何工作。 (操作系統:Ubuntu的12.04)正則表達式在Sed中的空格字符

要匹配的表達式(從文本文件中刪除):

a c 4 
a k 23 
o s 1 

我試了一下:

's/[[a-z][:space:][a-z][:space:][0-9]]\{1,\}//gi' 
's/.\s.\s[0-9]+//g' 
's/[:alpha:][:space:][:alpha:][:space:][:digit:]+' 

回答

13

這應該匹配:

sed 's/[a-z][ ]*[a-z][ ]*[0-9]*//gi' 

你的第一次嘗試忽略了幾個方括號,你不需要最外層的o NE:因爲你需要躲避+

sed 's/[a-z][[:space:]][a-z][[:space:]][0-9]\{1,\}//gi' input 

你的第二個示例失敗,它仍然會在GNU的sed只工作:

sed 's/.\s.\s[0-9]\+//g' input 

也有一些類似的問題,最後一個:

sed 's/[[:alpha:]][[:space:]][[:alpha:]][[:space:]][[:digit:]]\+//' input 
1

一個在中間是關閉!出於我無法理解的原因,你必須逃避加號。 我也將點「.」替換爲「[a-z]」,所以它只匹配字母。

sed 's/[a-z]\s[a-z]\s[0-9]\+//g' 

老版便攜版本sed -Versions(您好,Mac用戶!)。有些sed實現是挑剔的 「+」:

sed 's/[a-z]\s[a-z]\s[0-9][0-9]*//g' 
1

[...]定義字符類。 [a-z]匹配從az的任何字符。要匹配連續的字符,您必須爲每個字符使用一個類:[a-z][[:space:]][a-z]

對於+具有特殊含義,您必須將其反斜槓:[0-9]\+

命名字符類只在字符類內工作,即[[:alpha:]][[:space:]]