Команда, яка виділяє регулярний вираз у тексті?


14

Чи є команда, яка виділяє певний вираз у тексті?

Я шукаю щось на кшталт функції "пошук" менше, але з нормальним виведенням тексту в stdout, а не з lessпереглядачем.

Приклад:

$ cat test.txt | highlight "an"

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

Він може використовувати колір або будь-який інший спосіб, щоб виділити вказаний регулярний вираз.



@Gilles, дещо, але це питання мало набагато складніші вимоги.
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")/'', але, можливо, останній більш ефективний. Змініть "а" на інший пошуковий термін. ;)
sjas

Оце Так! Я використав це для зміни команди, якою я перелічував всі bashrcпсевдоніми, і тепер усі мої псевдоніми виділені червоним кольором. Супер! alias aliases="clear;cat ~/.bashrc|grep --color \"alias\""
Nav

9

ack має --passthruваріант, який буде робити це:

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

2
(+1) btw: в репортажі Ubuntu пакет (і виконуваний файл) називається ack-grep... (назва ackзастосовується до конвертора коду Kanji)
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

"колір" також працює. Ви також можете визначити псевдонім, щоб грап завжди використовував параметр:

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

Помістіть вище в /etc/profile.d/ десь або у вашому .bashrc чи будь-якому іншому.


1
Це тільки друкує відповідні рядки. Френк хоче весь текст, лише з виділеними сірниками.
cjm

До вищезазначеного додали -С - він працює, але трохи заплутаний!
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 файл`.
Маттео

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