GNU로 grep:
N=10; grep -roP ".{0,$N}foo.{0,$N}" .
설명:
-o => 일치하는 내용 만 인쇄
-P => Perl 스타일 정규식 사용
- 정규 표현식은 0을
$N문자 와 일치 시키고 foo그 뒤에 0을 문자 와 일치 $N시킵니다.
GNU가 없다면 grep:
find . -type f -exec \
perl -nle '
BEGIN{$N=10}
print if s/^.*?(.{0,$N}foo.{0,$N}).*?$/$ARGV:$1/
' {} \;
설명:
우리는 더 이상 grepGNU에 의존 할 수 없으므로 파일을 재귀 적으로 검색하는 grep데 사용 find합니다 ( -rGNU 의 동작 grep). 발견 된 각 파일에 대해 Perl 스 니펫을 실행합니다.
펄 스위치 :
-n 파일을 한 줄씩 읽으십시오
-l 각 줄 끝에서 줄 바꿈을 제거하고 인쇄 할 때 다시 넣으십시오.
-e 다음 문자열을 코드로 취급
Perl 스 니펫은 기본적으로와 동일한 작업을 수행 grep합니다. 변수 $N를 원하는 컨텍스트 문자 수로 설정하여 시작합니다 . BEGIN{}수단이 모든 파일의 모든 라인 한번도 실행을 시작할 때 한 번만 실행됩니다.
각 행에 대해 실행 된 명령문은 정규식 대체가 작동하는 경우 행을 인쇄하는 것입니다.
정규식 :
- 오래된 것은 유유히 일치 1 라인의 시작에 (
^.*?) 다음 .{0,$N}같이 grep다음, 경우 foo다른 다음 .{0,$N}마지막 행의 마지막까지 느리게 오래된 일을 일치 ( .*?$).
- 우리는 이것을로 대체합니다
$ARGV:$1. $ARGV읽고있는 현재 파일의 이름을 보유하는 마법 변수입니다. $1Parens가 일치하는 것입니다.이 경우의 컨텍스트입니다.
- 욕심 많은 경기는 일치
foo하지 않고 모든 문자를 먹기 때문에 (두 번 일치 할 수 있기 때문에) 양쪽 끝에 게으른 경기가 필요합니다 .{0,$N}.
(1) 이 전체 일치 실패하지 않는 한이다, 아무것도 일치되지 선호합니다. 한마디로 가능한 적은 문자를 일치시킵니다.