突出显示单词而不影响文本结构

突出显示单词而不影响文本结构
$cat contents.txt

cat-1.15

cat-1.15

cat-1.15
cat-1.18

上面的输出有空行

$cat contents.txt | grep cat 导致单词 cat 被突出显示,但生成的文本也会被合并,消除空白行

cat-1.15
cat-1.15
cat-1.15
cat-1.18

如何 grep 突出显示而不影响文本结构,以便唯一的区别是突出显示 grep 术语?

答案1

使用 GNU grep 这可以通过选项来完成-z

-z, --空数据

将输入和输出数据视为行序列,每行以零字节(ASCII NUL 字符)而不是换行符结尾。与 -Z 或 --null 选项一样,此选项可以与 sort -z 等命令一起使用来处理任意文件名。

这也是一个乌鲁木齐大学。您可以使用 grep 指定输入文件。

$ grep --color cat contents.txt
cat-1.15
cat-1.15
cat-1.15
cat-1.18
$ grep --color -z cat contents.txt
cat-1.15

cat-1.15

cat-1.15
cat-1.18

答案2

另一种可能的解决方案是向 提供两种模式grep:一个是要搜索的实际模式或术语,第二个是空字符串。

$ grep --color -e 'cat' -e '' testfile.txt
cat-1.15

cat-1.15

cat-1.15
cat-1.18

-e选项用于指定多个模式。从手册中:

-e PATTERN,--regexp=PATTERN

使用 PATTERN 作为模式。这可用于指定多个搜索模式,或保护以连字符 (-) 开头的模式。 (-e由 POSIX 指定。)

如果需要,您还可以将这些模式组合为单个扩展正则表达式:

$ grep --color -E 'cat|' testfile.txt
cat-1.15

cat-1.15

cat-1.15
cat-1.18

此外,如果您需要突出显示多个关键字,您可以简单地将另一种模式添加到列表中。

答案3

grep 还有更多可能性:

grep 查找 0 个或多个 的实例cat

grep --color '\(cat\)*' contents.txt

grep 为cat 或者空字符串:

grep -E --color 'cat|' contents.txt

(-E 指定扩展正则表达式语法。 egrep可以代替grep -E此处使用。)


或者你可以使用sed使用手动进行着色ANSI 转义码:

red='\c[[1;31m'
default='\c[[0m'
sed "s/cat/${red}cat${default}/g" contents.txt

这里reddefaultshell 变量只是为了方便 - 它们的值也可以内联放置在 sed 表达式中。

答案4

我尝试使用以下命令

sed -r "/cat/{N;s/^$/&=/}" filename


awk '{if(((length($1)>3)&& ($1 ~ /cat/))||($0~/^$/)){print $0}}' filename

相关内容