2013-02-17 540 views
2

的任意量我有一個其中有幾行是類似於如下正則表達式 - 匹配的號碼

data 
datalater 
983290842 
Data387428later 
datafhj893724897290384later 
4329804928later 

我所希望做的是使用正則表達式,匹配以數據開始的任何行文件並在晚些時候結束並具有中間的數字。這是我迄今編造的東西:

^[D,d]ata[0-9]*later$ 

但是,輸出包括所有數據轉移行。我想我可以管輸出和grep -v datalater,但是我覺得單個表達式應該可以做到。

回答

2

使用+而不是*

+匹配至少一個或多個前述內容。
*匹配零個或多個。

^[Dd]ata[0-9]+later$ 

在grep的,你需要躲避+,並且我們可以使用\d這是一個字符類和個位數相匹配。

^[Dd]ata\d\+later$ 

在你的示例文件,你也有一個線:

datafhj893724897290384later 

目前這不會匹配由於有被封的數據和號碼之間。我們可以通過添加一個[^0-9]*來解決這個問題,以匹配數據之後的任何內容直到數字。

我們最後的命令是:

grep '^[Dd]ata[^0-9]*\d\+later$' filename 
+0

結果當使用這種表達,或@Eric,我得到的輸出沒有結果。以下是我正在使用的: grep^[D,d] ata [0-9] +更高$ filename – hdub 2013-02-17 21:49:12

+0

沒有意識到您使用的是grep,會更新。 – 2013-02-17 21:55:23

+0

仍然沒有骰子,甚至作爲複製/粘貼。 – hdub 2013-02-17 22:17:37

1

你應該把一個「+」,而不是(這意味着一個或幾個)「*」(這意味着零,一個或幾個

+0

oOps,湯姆回答,當我在幾件事情中寫出答案時,他明白了! – Fafhrd 2013-02-17 21:41:06

2

你」再與*預選賽匹配零個或多個數字。嘗試

^[Dd]ata\d+later$ 

吧。你也親臨字符串的開頭找到逗號(如「ata1234later」)和\ d是一個快捷方式尋找任何數字性格。所以我也改變了這些。

+0

我希望這顯示輸出,但不會產生任何結果。看到我對@Tom的迴應 – hdub 2013-02-17 21:51:46

0

使用Cygwin,上述命令不起作用。我不得不修改上面給出的命令來獲得所需的結果。

$ cat > file.txt <<EOL 
> data 
> datalater 
> 983290842 
> Data387428later 
> datafhj893724897290384later 
> 4329804928later 
> EOL 

我總是想確保我的文件有什麼我希望它具有:

$ cat file.txt 
data 
datalater 
983290842 
Data387428later 
datafhj893724897290384later 
4329804928later 

$ 

我需要運行與-P標誌Perl樣式的表達式。這意味着我無法使用[^0-9]+,其必要性@Tom_Cammann恰當地指出。相反,我使用.*,它匹配任何不匹配模式下一部分的字符序列。這裏是我的命令和輸出。

$ grep -P '^[Dd]ata.*\d+later$' file.txt 
Data387428later 
datafhj893724897290384later 

$ 

我希望我可以給爲什麼需要Perl的表現更好的解釋,但我只知道,Cygwin的grep工作稍有不同。

系統信息

$ uname -a 
CYGWIN_NT-10.0 A-1052207 2.5.2(0.297/5/3) 2016-06-23 14:29 x86_64 Cygwin 

我從以前的答案

$ grep '^[Dd]ata[^0-9]*\d\+later$' file2.txt 

$ grep '^[Dd]ata\d+later$' file2.txt 

$ grep -P '^[Dd]ata[^0-9]*\d\+later$' file2.txt 

$ grep -P '^[Dd]ata\d+later$' file2.txt 
Data387428later 

$