Perl:删除不以模式开头的字符串

时间:2014-03-11 18:00:15

标签: regex perl

我有这个输入:

NP_001239382 1002 A G
NP_001074602 1005 A V
NP_001230039 100 A V
NP_932785 100 A V
NP_001164038 1018 A S

并希望使用某种正则表达式将其转化为此:

NP_001239382
NP_001074602
NP_001230039
NP_932785
NP_001164038

基本上,约束是“删除字符串,如果它不以'NP'开头”,但我不确定如何做到这一点。

2 个答案:

答案 0 :(得分:3)

我发布此评论作为评论,但因为所有soosus都在寻找我会发布它作为答案。

在这种情况下,我们不必匹配和删除不以NP开头的单词。由于我们想要的所有字符串都是该行的第一个单词,因此我们只需要删除所有内容。我们可以用这个单行代码来做到这一点:

perl -ple 's/[ \t].*//' input.txt > output.txt

它删除每行之后的所有内容,包括每行的第一个空格或制表符,为我们留下所需的字符串。

答案 1 :(得分:0)

相当简单:

s/(?:\s++|(?<!\S))(?!NP)\S++//;

虽然如果你要更多地谈论这个问题会有所帮助;这些行是在文件中吗?数组?一起在一个字符串中?

这消除了不启动NP的非空白字符以及任何前面的空格(如果没有,则确保这不是NP字符串的中间位置。)