如何 grep 查找字面值“..”

如何 grep 查找字面值“..”

我正在使用 grep 解析文件,屏幕上的输出包含换行符,如下所示:

$ grep 'gene' sequence.gb
     gene            89..1483
                     /gene="non-structural protein"
                     /gene="non-structural protein"
                     /gene="non-structural protein"
                     /gene="non-structural protein"
                     /gene="non-structural protein"
                     /gene="non-structural protein"
                     /gene="non-structural protein"
     gene            complement(1987..2763)
                     /gene="nucleocapsid protein"
                     /gene="nucleocapsid protein"

我可以将其分配给一个变量并仍然使用换行符打印出来:

$ gene=$(grep 'gene' sequence.gb)
echo "$gene"
     gene            89..1483
                     /gene="non-structural protein"
                     /gene="non-structural protein"
                     /gene="non-structural protein"
                     /gene="non-structural protein"
                     /gene="non-structural protein"
                     /gene="non-structural protein"
                     /gene="non-structural protein"
     gene            complement(1987..2763)
                     /gene="nucleocapsid protein"
                     /gene="nucleocapsid protein"

但这不包含真正的换行符,因为如果我再次 grep 查找包含 '..' 的行,我会得到全部:

$ echo "$gene" | grep '..'
     gene            89..1483
                     /gene="non-structural protein"
                     /gene="non-structural protein"
                     /gene="non-structural protein"
                     /gene="non-structural protein"
                     /gene="non-structural protein"
                     /gene="non-structural protein"
                     /gene="non-structural protein"
     gene            complement(1987..2763)
                     /gene="nucleocapsid protein"
                     /gene="nucleocapsid protein"

我们可以看到这是一个不使用引号的单个字符串:

$ echo $gene
gene 89..1483 /gene="non-structural protein" /gene="non-structural protein" /gene="non-structural protein" /gene="non-structural protein" /gene="non-structural protein" /gene="non-structural protein" /gene="non-structural protein" gene complement(1987..2763) /gene="nucleocapsid protein" /gene="nucleocapsid protein"

所以我的问题是,如何维护换行格式或引入它?

谢谢

答案1

因为.是正则表达式通配符,所以grep '..'匹配至少包含两个字符的每一行:

$ echo "$gene" | grep '..'
     gene            89..1483
                     /gene="non-structural protein"
                     /gene="non-structural protein"
                     /gene="non-structural protein"
                     /gene="non-structural protein"
                     /gene="non-structural protein"
                     /gene="non-structural protein"
                     /gene="non-structural protein"
     gene            complement(1987..2763)
                     /gene="nucleocapsid protein"
                     /gene="nucleocapsid protein"

在正则表达式中,.它确实很疯狂:它不仅匹配任何字母或数字,还匹配任何标点符号、空格、制表符或任何其他字符。

要仅匹配句点,请使用-F

$ echo "$gene" | grep -F '..'
     gene            89..1483
     gene            complement(1987..2763)

-F是 的缩写--fixed-strings,告诉grep我们将模式视为固定字符串,而不是正则表达式。

或者,可以转义句点,以便它们只匹配句点(提示:缺口):

$ echo "$gene" | grep '\.\.'
     gene            89..1483
     gene            complement(1987..2763)

或者,我们可以grep通过将句点放入字符类中来强制将句点视为字面句点(帽子提示:戴夫·汤普森):

$ echo "$gene" | grep '[.][.]'
     gene            89..1483
     gene            complement(1987..2763)

不过,如果您不需要正则表达式,请使用正则表达式,-F因为它可以使grep处理速度更快。

相关内容