我正在使用 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
处理速度更快。