2017-08-14 40 views
1

我不能完全得到正則表達式我需要解決這個問題,所以要求SO嚮導幫助!sed正則表達式之間已知的字和未知的整數

考慮:

LOCUS  NODE_96_length_17326_cov_8.76428_ID_1>17327 bp DNA linear 
LOCUS  NODE_97_length_17208_cov_6.56803_ID_1>17208 bp DNA linear 
LOCUS  NODE_98_length_17111_cov_6.60638_ID_1>17111 bp DNA linear 
LOCUS  NODE_99_length_17092_cov_6.7682_ID_19717092 bp DNA linear 
LOCUS  NODE_9_length_59921_cov_8.04963_ID_1759921 bp DNA linear 

我需要更換和數字以相同字符串的結尾序列NODE之間的字符串。數字前面的字符(例如第1行,17327)可以顯示爲>_。所以基本上我需要替換從NODE直到包括最後的>_的所有內容,或者匹配直到一個未知長度的多位整數。

盡我會設法到目前爲止是:

sed 's/\(NODE.*\)\(>|_\)/newstring/' 

但我知道這是行不通的。

只是爲了讓它痛苦清楚,這將是所需的輸出。

LOCUS  newstring 17327 bp DNA linear 
LOCUS  newstring 17208 bp DNA linear 
LOCUS  newstring 17111 bp DNA linear 
LOCUS  newstring 19717092 bp DNA linear 
LOCUS  newstring 1759921 bp DNA linear 

回答

3

由於您沒有使用任何反向引用,因此不需要使用任何組。您可以使用:

sed 's/NODE[^[:blank:]]*[_>]/newstring /' file 

LOCUS  newstring 17327 bp DNA linear 
LOCUS  newstring 17208 bp DNA linear 
LOCUS  newstring 17111 bp DNA linear 
LOCUS  newstring 19717092 bp DNA linear 
LOCUS  newstring 1759921 bp DNA linear 
+1

我只是建議在行後面出現下劃線或尖括號的情況下,使用'[^ ​​[:blank:]] *'而不是'。*'。 –

+0

謝謝@glennjackman,非常好的建議。 – anubhava

+0

非常感謝,我之前沒有遇到過空白,那麼在這種情況下,正則表達式究竟尋找什麼? –

1

我會做這樣的:

\b(NODE.*\D)\d+\s 

一個單詞邊界,單詞NODE,什麼都漲,直到東西是不是一個數字,然後一個或多個數字,然後一個空白字符。 Demo

Sed可能需要字邊界爲\<(字的開頭)。

+0

酷炫的演示資源,謝謝! –

相關問題