Ответ 1
3 символа до и 4 символа после
$> echo "some123_string_and_another" | grep -o -P '.{0,3}string.{0,4}'
23_string_and
Используя это:
grep -A1 -B1 "test_pattern" file
будет выводить одну строку до и после совпадающего шаблона в файле. Есть ли способ отображать не строки, а определенное количество символов?
Линии в моем файле довольно большие, поэтому мне не интересно печатать всю строку, а только наблюдать за соответствием в контексте. Любые предложения о том, как это сделать?
3 символа до и 4 символа после
$> echo "some123_string_and_another" | grep -o -P '.{0,3}string.{0,4}'
23_string_and
grep -E -o ".{0,5}test_pattern.{0,5}" test.txt
Это будет соответствовать до 5 символов до и после вашего шаблона. Переключатель -o указывает grep показывать только совпадение, а -E - использовать расширенное регулярное выражение. Не забудьте поставить кавычки вокруг вашего выражения, иначе это может интерпретироваться оболочкой.
Вы можете использовать
awk '/test_pattern/ {
match($0, /test_pattern/); print substr($0, RSTART - 10, RLENGTH + 20);
}' file
Вы имеете в виду, например:
grep -o '.\{0,20\}test_pattern.\{0,20\}' file
?
Это будет печатать до двадцати символов по обе стороны от test_pattern
. Обозначение \{0,20\}
похоже на *
, но указывает от нуля до двадцати повторений вместо нуля или более. -o
говорит, что отображает только совпадение, а не всю строку.
С помощью 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
Вы можете использовать regexp grep для поиска + второй grep для выделения
echo "some123_string_and_another" | grep -o -P '.{0,3}string.{0,4}' | grep string
23_string_and