答案1
我考虑过使用cat -A
来对打印输出进行后处理grep
,它会添加 来$
标记行尾,但也会分解颜色的转义码。
但是,至少 GNU coreutilscat
有cat -E
,它只标记行结束,所以你会得到例如
$ printf 'foo\nbar\n' | grep --color=always . | cat -E
foo$
bar$
标志$
没有着色。
或者使用 Perl 手动执行此操作,这会将换行符替换为<NL>
:
$ printf 'foo\nbar\n' | grep --color=always . | perl -pe 's/\n/<NL>/'; echo
foo<NL>bar<NL>
同样,这些<NL>
部件也没有着色。
使用 时grep -z
,换行符将被着色,表明 确实.
与换行符匹配,至少在 NUL 分隔模式下是如此。
颜色相同:
(grep .
如上所述,GNU grep 在每个单独的字符之前和之后打印变色转义符,即在每个匹配实例的开始和结束处。您可以更改为 例如grep '..*'
以一次性匹配更长的序列,并在输出中获得更少的转义符.)
答案2
如果发布所使用的文本而不是图像,对每个人来说都会更容易。为了帮助大家,这里是文件(在互联网上找到的部分内容):
$ cat HBB.fna
>NM_000518.5 Homo sapiens hemoglobin subunit beta (HBB), mRNA
ACATTTGCTTCTGACACAACTGTGTTCACTAGCAACCTCAAACAGACACCATGGTGCATCTGACTCCTGA
GGAGAAGTCTGCCGTTACTGCCCTGTGGGGCAAGGTGAACGTGGATGAAGTTGGTGGTGAGGCCCTGGGC
AGGCTGCTGGTGGTCTACCCTTGGACCCAGAGGTTCTTTGAGTCCTTTGGGGATCTGTCCACTCCTGATG
CTGTTATGGGCAACCCTAAGGTGAAGGCTCATGGCAAGAAAGTGCTCGGTGCCTTTAGTGATGGCCTGGC
TCACCTGGACAACCTCAAGGGCACCTTTGCCACACTGAGTGAGCTGCACTGTGACAAGCTGCACGTGGAT
CCTGAGAACTTCAGGCTCCTGGGCAACGTGCTGGTCTGTGTGCTGGCCCATCACTTTGGCAAAGAATTCA
CCCCACCAGTGCAGGCTGCCTATCAGAAAGTGGTGGCTGGTGTGGCTAATGCCCTGGCCCACAAGTATCA
CTAAGCTCGCTTTCTTGCTGTCCAATTTCTATTAAAGGTTCCTTTGTTCCCTAAGTCCAACTACTAAACT
GGGGGATATTATGAAGGGCCTTGAGCATCTGGATTCTGCCTAATAAAAAACATTTATTTTCATTGCAA
那么,你的问题是:
我试图描述点 (.) 在正则表达式中的工作原理。
没有简单的方法可以将 grep 中的换行符与dot
( .
) 相匹配。我们所看到的可以暗示这一点:
匹配的字符必须是 3 个点的倍数,即 69 个,只留下 1 个与点不匹配的字符。这就是为什么大多数行中都有一个非彩色的最后一个字符。
但即使我们使用 71 个点(因为 71 是素数,没有其他数字可以匹配)。这就是我们在每行中看到的 70 个字符加上一个结尾换行符。
因为.
dot
无法匹配换行符。它在处理每行之前被删除,并在处理该行之后重新连接。任何情况下都没有可匹配的换行符。
即使我们使用非标准-z
选项(它将整个文本输入处理为一个连续的块,因此允许换行符保留在匹配的文本中,换行符也会成为一个非打印字符,很像 anspace
或 atab
或其他一些whitespace
,终端无法打印它们。
因此,我们需要将换行符(匹配或不匹配,但出现在输出中)转换为可见的内容(让我们使用 a =
,类似于$
vi 或 的编码sed -n l
),并添加一个额外的换行符,以便行不会折叠成 a连续(无格式)字符流。使用sed -z 's/\n/=\n'
或其他类似的编辑器 很容易做到这一点:
因此,在 grep 中无法将换行符与dot
( .
) 相匹配,甚至在默认的 pcre 中也是如此。但是我们可以通过智能编辑 grep 输出来使换行符出现并被看到。
希望能解决您的需求。