Grep персонажей до и после матча? - PullRequest
120 голосов
/ 12 ноября 2011

Используя это:

grep -A1 -B1 "test_pattern" file

выдаст одну строку до и после сопоставленного шаблона в файле. Есть ли способ отображать не строки, а указанное количество символов?

Строки в моем файле довольно большие, поэтому я не заинтересован в печати всей строки, а просто наблюдаю за совпадением в контексте. Любые предложения о том, как это сделать?

Ответы [ 5 ]

148 голосов
/ 12 ноября 2011

3 знака до и 4 символа после

$> echo "some123_string_and_another" | grep -o -P '.{0,3}string.{0,4}'
23_string_and
89 голосов
/ 12 ноября 2011
grep -E -o ".{0,5}test_pattern.{0,5}" test.txt 

Это будет соответствовать до 5 символов до и после вашего шаблона. Ключ -o указывает grep показывать только совпадение, а -E использовать расширенное регулярное выражение. Обязательно поместите кавычки вокруг вашего выражения, иначе оно может быть интерпретировано оболочкой.

29 голосов
/ 12 ноября 2011

Вы можете использовать

awk '/test_pattern/ {
    match($0, /test_pattern/); print substr($0, RSTART - 10, RLENGTH + 20);
}' file
21 голосов
/ 12 ноября 2011

Вы имеете в виду, вот так:

grep -o '.\{0,20\}test_pattern.\{0,20\}' file

Это напечатает до двадцати символов по обе стороны от test_pattern. Обозначение \{0,20\} похоже на *, но указывает от нуля до двадцати повторений вместо нуля или более. -o говорит, что нужно показывать только само соответствие, а не всю строку.

0 голосов
/ 14 марта 2017

С gawk, вы можете использовать функцию сопоставления:

    x="hey there how are you"
    echo "$x" |awk --re-interval '{match($0,/(.{4})how(.{4})/,a);print a[1],a[2]}'
    ere   are

Если вы в порядке с perl, более гибкое решение: ниже будет напечатано три символа перед шаблоном, затем фактический шаблон, а затем5 символов после шаблона.

echo hey there how are you |perl -lne 'print "$1$2$3" if /(.{3})(there)(.{5})/'
ey there how

Это также может быть применено к словам, а не только к символам. Следующие будут печатать одно слово перед фактической соответствующей строкой.

echo hey there how are you |perl -lne 'print $1 if /(\w+) there/'
hey

После будет напечатано одно слово после шаблона:

echo hey there how are you |perl -lne 'print $2 if /(\w+) there (\w+)/'
how

После будет напечатано одно слово перед шаблоном, затем фактическое слово и затем одно слово после шаблона:

echo hey there how are you |perl -lne 'print "$1$2$3" if /(\w+)( there )(\w+)/'
hey there how
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...