在文本中突出显示正则表达式的命令?


14

是否有命令突出显示文本中的某个表达式?

我正在寻找类似“搜索”功能的东西,但是要在stdout而不是less查看器上输出普通文本。

例:

$ cat test.txt | highlight "an"

对于前景距离Afgh有序撤出北约 IST 遭遇了两次挫折总统卡尔扎伊德国马克关于美国军队DED限制 d的塔里布暂停和谈。

它可以使用颜色或任何其他方式突出显示指定的正则表达式。


1
可能重复的highlight命令
吉勒斯

@Gilles有点,但是这个问题的要求要复杂得多。
cjm 2012年

Answers:


17

不知道这是由于某个功能还是某种隐藏的副作用,但这在GNU grep2.11中有效:

grep --color 'an\|' test.txt

10
就像你在做grep 'an' OR ''。在''成功匹配没有在输入每个位置。仅an突出显示,因为您无法突出显示任何内容。:-)
Mikel

纯粹的天才。它对我不起作用,但是grep --color -e 'an' -e ' '(匹配一个无法着色的空格就可以了)。比用管道输送到更好sed -e ''/an/s//$(printf "\033[33;1m&\033[0m")/'',但是后者可能更有效。将“ an”更改为另一个搜索词。;)
sjas 2015年

哇!我用它来修改用于列出所有bashrc别名的命令,现在所有别名都以红色突出显示。超!alias aliases="clear;cat ~/.bashrc|grep --color \"alias\""
2015年

9

ACK有一个--passthru选项,将做到这一点:

ack --passthru an test.txt
some_command | ack --passthru an -

2
(+1)顺便说一句:在Ubuntu仓库中,该软件包(和可执行文件)被称为ack-grep...(该名称ack应用于汉字代码转换器)
Peter.O 2012年

2

您可以尝试一下我的这个脚本。它可以让您指定文件或接受标准输入。您可以为要突出显示的文本定义Python正则表达式。高亮显示的文本默认为霓虹绿(嘿,我使用黑色背景!),但是您可以更改ANSI颜色代码

#!/usr/bin/env python

import sys
import re

def highlight_text(text,pat):
    def replacement_funk(matchobj):  return '\x1b[42m%s\x1b[0m'%matchobj.group(0)
    return re.sub(pat,replacement_funk,text)

if __name__ == '__main__':
    if len(sys.argv) == 2:
        input = sys.stdin
        pat = sys.argv[1]
    elif len(sys.argv) == 3:
        input = open(sys.argv[2])
        pat = sys.argv[1]
    else:
        sys.stderr.write("colorme pattern [inputfile]")
    text = input.read()
    print highlight_text(text,pat)

这是一个例子。

blessburn@blessburn:/tmp$ cat test.txt | ./colorme.py an

对于前景距离Afgh有序撤出北约 IST 遭遇了两次挫折总统卡尔扎伊德国马克关于美国军队DED限制 d的塔里布暂停和谈。

blessburn@blessburn:/tmp$ ./colorme.py '(Af.*? |NA[\w]{2})' test.txt

北约有序撤离阿富汗的前景遭受了两次挫折,因为总统哈米德·卡尔扎伊要求限制美军,而塔利班则中止了和谈。


stackexchange粗体标记看起来很时髦,这就是为什么输出有多余的星星。打败我。
fthinker 2012年

使用<b>,如果你需要一个字的粗体部分。
cjm 2012年

0

$cat test.txt | grep --colour=auto -C 100000 an

“颜色”也可以。您还可以定义一个别名,使grep始终使用以下选项:

alias grep='grep --colour=auto -C 100000'

将以上内容放在/etc/profile.d/或您的.bashrc中。


1
那只打印匹配的行。弗兰克想要全文,只突出显示匹配项。
cjm 2012年

在上面添加了-C-可以,但是有点混乱!
gerdesj 2012年

3
它的工作原理,但你应该不会创建一个名为grep的别名。与-C 1000000您再也无法grep。只需执行alias highlight='grep --colour=auto -C 1000000'. The cat in the first example is also not necessary: grep --colour = auto -C 100000文件`即可。
Matteo'3

我想知道大文件将消耗多少内存。(我从未研究过如何grep处理上下文行的集合。)
cjm 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.