Команда, которая выделяет регулярные выражения в тексте?


14

Есть ли команда, которая выделяет определенное выражение в тексте?

Я ищу что-то вроде функции поиска в меньшем количестве, но с обычным выводом текста на стандартный вывод вместо lessпросмотра.

Пример:

$ cat test.txt | highlight "an"

Перспективы на упорядоченный вывод НАТО из Afgh IST А.Н. пострадало два регресса как президент Хамид Карзай дем DED пределов войск Соединенных Штатов d Талиб остановил мирные переговоры.

Он может использовать цвет или любые другие средства, чтобы выделить указанное регулярное выражение.



@ Жиль, несколько, но у этого вопроса были куда более сложные требования.
cjm

Ответы:


17

Не уверен, что это связано с функцией или просто каким-то скрытым побочным эффектом, но это работает в GNU grep2.11:

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

10
Как будто ты делаешь grep 'an' OR ''. ''Успешно не совпадает ни с чем в любом месте на входе. Подсвечивается только то an, что ничего нельзя выделить. :-)
Микель

Чистый гений. Это не сработало для меня, но grep --color -e 'an' -e ' '(в соответствии с пробелом, который не может быть окрашен, сделал свое дело). Гораздо лучше, чем пайпинг sed -e ''/an/s//$(printf "\033[33;1m&\033[0m")/'', но, возможно, последний более производительный. Замените «an» на другой поисковый запрос. ;)
sjas

Вот это да! Я использовал это, чтобы изменить команду, которую использовал для отображения всех bashrcпсевдонимов, и теперь все мои псевдонимы выделены красным. Супер! alias aliases="clear;cat ~/.bashrc|grep --color \"alias\""
Нав

9

У ack есть --passthruопция, которая сделает это:

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

2
(+1) Кстати: в репозитории Ubuntu пакет (и исполняемый файл) называется ack-grep... (имя ackприменяется к конвертеру кода Кандзи)
Peter.O

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

Используйте, <b>если вам нужно выделить жирным шрифтом часть слова.
CJM

0

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

«цвет» тоже работает. Вы также можете определить псевдоним, чтобы grep всегда использовал опцию:

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

Поместите вышеупомянутое в /etc/profile.d/ где-нибудь или в свой .bashrc или что-то еще.


1
Это печатает только совпадающие строки. Фрэнк хочет весь текст, только с выделенными спичками.
cjm

Добавил -C к вышесказанному - работает, но немного грязно!
gerdesj

3
Это работает, но вы не должны создавать псевдоним под названием grep. С -C 1000000тобой никогда не удастся повторить. Просто выполните alias highlight='grep --colour=auto -C 1000000'. The cat in the first example is also not necessary: grep --colour = auto -C 100000 file`.
Маттео

Интересно, сколько памяти будет занимать большой файл. (Я никогда не изучал, как grepобрабатывает коллекцию контекстных строк.)
cjm
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.