突出显示类似于grep的文本,但不要过滤掉文本
当使用grep时,它会突出显示与正则expression式匹配的行中的任何文本。
如果我想要这样的行为,但是也可以用grep打印出所有行呢? 通过grep man页面快速查看后,我空了。
使用ack。 在这里检查它的--passthru
选项: ack 。 它具有允许完整的perl正则expression式的附加好处。
$ ack --passthru 'pattern1' file_name $ command_here | ack --passthru 'pattern1'
你也可以这样使用grep来做:
$ grep --color -E '^|pattern1|pattern2' file_name $ command_here | grep --color -E '^|pattern1|pattern2'
这将匹配所有行,并突出显示模式。 ^
匹配每一行的开头,但不会打印/突出显示,因为它不是一个字符。
(请注意,大多数设置将默认使用–color,您可能不需要该标志)。
你可以确保所有的线都匹配,但没有什么可以突出无关的匹配
egrep --color 'apple|' test.txt
笔记:
-
egrep
也可能拼写为grep -E
-
--color
在大多数发行版中,--color
通常是默认的
编辑:
这适用于OS X Mountain Lion的grep:
grep --color -E 'pattern1|pattern2|$'
这比'^|pattern1|pattern2'
更好,因为^
部分交替匹配在行的开始,而$
匹配在行的末尾。 一些正则expression式引擎不会突出显示pattern1
或pattern2
因为^
已经匹配并且引擎很渴望 。
类似的事情发生了'pattern1|pattern2|'
因为正则expression式引擎注意到模式string末尾的空交替符合主题string的开头。
[1]: http://www.regular-expressions.info/engine.html
第一次编辑:
我结束了使用Perl:
perl -pe 's:pattern:\033[31;1m$&\033[30;0m:g'
这假设你有一个兼容ANSI的terminal。
原文答案:
如果你被困在一个奇怪的grep
,这可能工作:
grep -E --color=always -A500 -B500 'pattern1|pattern2' | grep -v '^--'
调整数字以获得所有你想要的行数。
第二个grep
只是在Mac OS X Mountain Lion中删除由BSD风格的grep
插入的无关行,即使连续匹配的上下文重叠。
我认为当上下文重叠时,GNU grep忽略了这些行,但是这已经有一段时间了,所以我可能记错了。
您可以使用我的突出显示脚本从https://github.com/kepkin/dev-shell-essentials
这比grep 更好 ,因为你可以使用自己的颜色来突出每个匹配。
$ command_here | highlight green "input" | highlight red "output"
既然你想匹配突出显示,这可能是人类消费(而不是pipe道到另一个程序),所以一个很好的解决scheme将是使用:
less -p <your-pattern> <your-file>
如果你不关心区分大小写:
less -i -p <your-pattern> <your-file>
这也有页面的好处,这是很好的,当不得不经过一个长期的输出
你可以使用grep来做:
- 逐行读取文件
- 匹配每行中的模式,并通过grep高亮显示模式
- 如果没有匹配,则按原样回显行
这给你以下内容:
while read line ; do (echo $line | grep PATTERN) || echo $line ; done < inputfile
如果你想打印“所有”行,有一个简单的工作解决scheme:
grep "test" -A 9999999 -B 9999999
- A =>之后
- B =>以前
如果你这样做,因为你想在search中更多的上下文,你可以这样做:
cat BIG_FILE.txt | less
less
search应突出search条件。
或者将输出传送给你最喜欢的编辑器。 一个例子 :
cat BIG_FILE.txt | vim -
然后search/突出显示/replace。
如果您正在recursion查找目录中的模式,则可以先将其保存到文件中。
ls -1R ./ | list-of-files.txt
然后grep,或pipe它到grepsearch
ls -1R | grep --color -rE '[AZ]|'
这将列出所有的文件,但用大写字母的颜色。 如果你删除最后一个| 你只会看到比赛。
我使用这个来查找以大写字母命名的图像,但是正常的grep并没有为每个目录显示每个文件的path,所以这样我可以看到上下文。
也许这是一个XY问题 ,你真正想做的是突出显示出现在你的shell中的单词的出现。 如果是这样,你可能能够使用你的terminal模拟器。 例如,在Konsole中,启动Find(ctrl + shift + F)并键入您的单词。 无论何时出现在新的或现有的输出中,该单词将被突出显示,直到您取消该function。