使用 grep 显式显示换行符

使用 grep 显式显示换行符

有没有办法grep以人类可读的方式显示文件中的换行符,例如,以vim显示行尾字符的$方式:set list

我试图描述点 ( .) 在正则表达式中的工作原理。作为最初的说明,我搜索仅由点组成的图案,例如grep --color=auto '.' HBB.fna(图像)。使用该--color选项,文件中的每个字符都会在输出中以匹配颜色显示。但是,我想明确显示行尾字符以表明它们是不是匹配。因为我正在谈论grep,我不想使用除它之外的任何东西。

示例输出在附件中。再说一次,我想要的是行尾字符出现在每行的末尾,而不是以匹配颜色出现。

任何帮助,将不胜感激。

在此输入图像描述

答案1

我考虑过使用cat -A来对打印输出进行后处理grep,它会添加 来$标记行尾,但也会分解颜色的转义码。

但是,至少 GNU coreutilscatcat -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 输出来使换行符出现并被看到。

希望能解决您的需求。

相关内容