![突出显示单词而不影响文本结构](https://linux22.com/image/146974/%E7%AA%81%E5%87%BA%E6%98%BE%E7%A4%BA%E5%8D%95%E8%AF%8D%E8%80%8C%E4%B8%8D%E5%BD%B1%E5%93%8D%E6%96%87%E6%9C%AC%E7%BB%93%E6%9E%84.png)
$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
此处使用。)
red='\c[[1;31m'
default='\c[[0m'
sed "s/cat/${red}cat${default}/g" contents.txt
这里red
和default
shell 变量只是为了方便 - 它们的值也可以内联放置在 sed 表达式中。
答案4
我尝试使用以下命令
sed -r "/cat/{N;s/^$/&=/}" filename
awk '{if(((length($1)>3)&& ($1 ~ /cat/))||($0~/^$/)){print $0}}' filename