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