Grep 未检索带空格的字符串

Grep 未检索带空格的字符串

我的文件中有一系列标题,其名称如下:

grep ">scaffold_3" DM_v6.1_unanchoredScaffolds.fasta 
>scaffold_3
>scaffold_303
>scaffold_31
>scaffold_34
>scaffold_36
>scaffold_37
>scaffold_39
>scaffold_33
>scaffold_300

我只想选择第一个,所以我尝试了:

$ grep ">scaffold_3 " file.fasta 
$
$ grep ">scaffold_3[[:blank:]]" file.fasta 
$
$ grep ">scaffold_3\t" file.fasta 
$
$ grep ">scaffold_3\ " file.fasta 
$
$ grep ">scaffold_3 " file.fasta 
$
$ grep ">scaffold_3[[:space:]]" file.fasta 
$
$ grep ">scaffold_3$" file.fasta 
>scaffold_3

鉴于名称后面的字符可能是空格、制表符、换行符(也可能来自 Windows),并且这[[:space:]]不起作用,我怎样才能获得确切的名称而不是同义词?

谢谢

答案1

如果您知道文本后面没有空格,那就grep ">scaffold_3$"对了。

或者更确切地说,使用单引号,因为$在双引号内是特殊的,并且如果您也想锁定行的开头,则添加^或使用grep -x.所以grep '^>scaffold_3$'或者grep -x '>scaffold_3'

-x--line-regexp:强制 PATTERN 仅匹配整行)

如果行尾可以有空格并且想忽略任何空格,那么

grep -e '>scaffold_3[[:space:]]*$' 

将匹配字符串和行尾之间任意数量的可选空格。 (并且也会接受匹配,无论它在行中的哪个位置开始。)

请注意,如果文件可以具有 Windows 样式的 CRLF 行结尾,那么>scaffold_3$不是这样做,最后的 CR 将与模式不匹配。

答案2

如果我理解正确,您只想在文件的第一个条目中得到结果。

您可以 grep 查找该字符串的精确匹配

grep -w ">scaffold_3" file.fasta

相关内容