Я хочу запустить ack или grep в файлах HTML, которые часто имеют очень длинные строки. Я не хочу видеть очень длинные строки, которые повторяются многократно. Но я хочу видеть только ту часть длинной строки, которая окружает строку, которая соответствует регулярному выражению. Как я могу получить это, используя любую комбинацию инструментов Unix?
Как обрезать длинные совпадающие строки, возвращаемые grep или ack
Ответ 1
Вы можете использовать параметр 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.
Ответ 2
Произведите ваши результаты через cut
. Я также рассматриваю возможность добавления переключателя -cut, чтобы вы могли сказать --cut = 80 и получить только 80 столбцов.
Ответ 3
Вы можете использовать меньше в качестве пейджера для ack и нарезать длинные строки: ack --pager="less -S"
Это сохраняет длинную строку, но оставляет ее на одной строке вместо обертывания. Чтобы увидеть больше строки, прокрутите влево/вправо меньше с помощью клавиш со стрелками.
У меня есть следующая настройка псевдонимов для ack:
alias ick='ack -i --pager="less -R -S"'
Ответ 4
Предлагаемый подход ".{0,10}<original pattern>.{0,10}"
отлично подходит, за исключением того, что цвет подсветки часто перепутан. Я создал script с аналогичным результатом, но цвет также сохраняется:
#!/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))}"
Предполагая, что script сохраняется как grepl
, тогда grepl pattern file_with_long_lines
должен отображать соответствующие строки, но всего 10 символов вокруг соответствующей строки.