Intereting Posts
Как интерпретировать вывод intel-gpu-top и intel-gpu-overlay? Как настроить pulseaudio для использования как цифровых, так и аналоговых портов из 2 профилей? Перемещение / usr в собственную файловую систему / логический том В чем смысл числовой части страниц руководства? Не могу понять, почему Ethernet-пакеты игнорируются Где я могу скачать Fedora 12? Каковы числа после версии в выводе политики apt-cache? Разреженные файлы / файловые отверстия и неожиданный размер блока Как настроить две письма для двух разных пользователей в Ubuntu Почему «su -c <command> &», по-видимому, позволяет команде запускаться в фоновом режиме без зависания Сценарий для входа в ssh дважды Сортировка перед отправкой вывода на терминал Вырезать любую произвольную программу с помощью динамического компоновщика? Загрузите LiveCD и запустите установщик Linux другого диска mousekeys слишком медленный в gnome3 fedora

Bash: показать содержимое текстового файла, при каждом появлении выделенного слова

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

 grep -C $(wc -l foo.txt | cut -d" " -f 1) --color word foo.txt 

Где foo.txt – путь к файлу, а word – поисковый foo.txt . Если вы не знакомы с grep , остерегайтесь, что поисковый запрос на самом деле является регулярным выражением . Это не имеет значения, если word является чисто буквенно-цифровым, но определенные символы, такие как [ и ] имеют особое значение в регулярном выражении, и если вы хотите использовать их буквально, префикс \ . Кроме того, это проходит через оболочку, поэтому $ будет делать забавные вещи, если также не сбежать с \ .

Вы можете включать пробелы в word если вы заключите его в кавычки.

Другие команды, используемые здесь, – wc и cut , которые почти всегда будут использоваться в системе POSIX, такой как GNU / Linux. У них есть man страницы, объясняющие их использование.

Вы можете сделать это с помощью только grep . Где file.txt – ваш файл, а word – текст, который вы хотите выделить, вы можете использовать:

 grep --color -E ' word |$' file.txt 

Это соответствует и подчеркивает появление word . Кроме того, он альтернативно ( | ) соответствует и выделяет пустую строку в конце каждой строки ( $ ). Но поскольку эта строка пуста, дополнительный текст не выделяется.

Согласование $ в дополнение к word служит для обеспечения соответствия каждой строки. Затем grep печатает каждую строку, даже без параметров -A , -B или -C или любые вызовы других утилит.

Флаг -E делает grep интерпретирует его аргумент шаблона как расширенное регулярное выражение POSIX (ERE). В зависимости от того, какие символы в word , вы можете захотеть использовать основное регулярное выражение (BRE). Хотя чередование с | официально не входит в базовые регулярные выражения POSIX, реализация grep часто поддерживает его как расширение с помощью \| : 1

 grep --color ' word \|$' file.txt 

В частности, в системах GNU / Linux у вас есть GNU Grep, который поддерживает это. Если вы полагаетесь на --color , вы также можете положиться на это поведение.

Эти команды более простые, чем способ ответа в goldilocks . Но техника в этом ответе имеет определенные преимущества в некоторых обстоятельствах. Поскольку здесь используются методы | и $ , они должны быть регулярными выражениями, а не фиксированными строками. Однако с помощью метода goldilocks вы можете добавить флаг -F . Тогда word может содержать любой текст, который вам нравится, даже \ , если вы правильно цитируете word чтобы оболочка передавала его grep unmodified.

Например, вы можете использовать:

 grep --color -FC "$(wc -l < file.txt)" ' word ' file.txt 

Для дальнейшего чтения см. Convince grep для вывода всех строк, а не только те, у которых есть совпадения (как предложено steeldriver ).


1 Что касается стандарта (IEEE Std 1003.1-2008) , то чередование является особенностью ERE (через | ), но это не является особенностью BRE. Но реализациям разрешено интерпретировать \| как они хотят, и многие интерпретируют его как чередование:

Некоторые реализации расширили синтаксис BRE, чтобы добавить чередование. Например, подвыражение « \(foo$\|bar\) » будет соответствовать либо « foo » в конце строки, либо « bar » в любом месте. Расширение запускается с помощью неопределенной последовательности « \| ».