2017-08-14 16 views
1

正規表現を得ることができません。これを解決する必要がありますので、SOのウィザードに助けを求めてください!既知の単語と未知の整数との間の正規表現

を考える:

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、数字ではない何かまでは何もアップし、その後、1桁以上の数字空白文字。 Demo

Sedは、単語境界が\<(単語の先頭)として必要な場合があります。

+0

クールなデモリソース、ありがとう! –

関連する問題