Как обрезать длинные совпадающие строки, возвращаемые grep или ack - PullRequest
71 голосов
/ 09 января 2010

Я хочу запустить ack или grep для файлов HTML, которые часто имеют очень длинные строки.Я не хочу видеть очень длинные строки, которые повторяются.Но я хочу видеть только ту часть длинной строки, которая окружает строку, соответствующую регулярному выражению.Как я могу получить это, используя любую комбинацию инструментов Unix?

Ответы [ 5 ]

76 голосов
/ 09 января 2010

Вы можете использовать опцию grep -o, возможно, в сочетании с изменением шаблона на ".{0,10}<original pattern>.{0,10}", чтобы увидеть контекст вокруг него:

       -o, --only-matching
              Show only the part of a matching line that matches PATTERN.

.. или -c:

       -c, --count
              Suppress normal output; instead print a count of matching  lines
              for  each  input  file.  With the -v, --invert-match option (see
              below), count non-matching lines.
39 голосов
/ 10 января 2010

Передайте ваши результаты через cut.Я также планирую добавить переключатель --cut, чтобы вы могли сказать --cut=80 и получить только 80 столбцов.

21 голосов
/ 14 июня 2012

Вы можете использовать меньше как пейджер для подтверждения и прерывания длинных строк: ack --pager="less -S" Это сохраняет длинную строку, но оставляет ее на одной строке вместо переноса. Чтобы увидеть больше строки, прокрутите влево / вправо меньше с помощью клавиш со стрелками.

У меня есть следующая настройка псевдонима для ack:

alias ick='ack -i --pager="less -R -S"' 
4 голосов
/ 23 февраля 2018
cut -c 1-100

получает символы от 1 до 100.

1 голос
/ 19 августа 2016

Взято из: http://www.topbug.net/blog/2016/08/18/truncate-long-matching-lines-of-grep-a-solution-that-preserves-color/

Предлагаемый подход ".{0,10}<original pattern>.{0,10}" совершенно хорош, за исключением того, что цвет подсветки часто путается. Я создал скрипт с похожим выводом, но цвет также сохранился:

#!/bin/bash

# Usage:
#   grepl PATTERN [FILE]

# how many characters around the searching keyword should be shown?
context_length=10

# What is the length of the control character for the color before and after the
# matching string?
# This is mostly determined by the environmental variable GREP_COLORS.
control_length_before=$(($(echo a | grep --color=always a | cut -d a -f '1' | wc -c)-1))
control_length_after=$(($(echo a | grep --color=always a | cut -d a -f '2' | wc -c)-1))

grep -E --color=always "$1" $2 |
grep --color=none -oE \
    ".{0,$(($control_length_before + $context_length))}$1.{0,$(($control_length_after + $context_length))}"

Если сценарий сохранен как grepl, тогда grepl pattern file_with_long_lines должен отображать соответствующие строки, но только с 10 символами вокруг соответствующей строки.

...