如何grep文字'..'

Gig*_*iux 2 grep bash newlines

我正在使用 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"
Run Code Online (Sandbox Code Playgroud)

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

$ 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"
Run Code Online (Sandbox Code Playgroud)

但这不包含真正的换行符,因为如果我再次 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"
Run Code Online (Sandbox Code Playgroud)

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

$ 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"
Run Code Online (Sandbox Code Playgroud)

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

谢谢

Joh*_*024 12

因为.是正则表达式通配符,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"
Run Code Online (Sandbox Code Playgroud)

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

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

$ echo "$gene" | grep -F '..'
     gene            89..1483
     gene            complement(1987..2763)
Run Code Online (Sandbox Code Playgroud)

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

或者,您可以转义句号,以便它们仅匹配句号(帽子提示:Nick):

$ echo "$gene" | grep '\.\.'
     gene            89..1483
     gene            complement(1987..2763)
Run Code Online (Sandbox Code Playgroud)

或者我们可以grep通过将它们放在字符类中来强制将句点视为文字句点(帽子提示:dave_thompson):

$ echo "$gene" | grep '[.][.]'
     gene            89..1483
     gene            complement(1987..2763)
Run Code Online (Sandbox Code Playgroud)

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