답변:
diff -e bigger smaller 출력이 "유효한 스크립트"이므로 트릭을 수행하지만 약간의 해석이 필요합니다.
"더 큰"과 "더 작은"이라는 두 개의 파일을 만들었는데, "더 작은"의 내용이 "diff -e 더 큰 더 작은"을 수행하는 "더 큰"의 5 ~ 9 행과 동일합니다.
% diff -e bigger smaller
10,15d
1,4d
즉, " '더 큰'의 10 ~ 15 행을 삭제 한 다음 '작은'을 얻기 위해 1 ~ 4 행을 삭제하십시오." 즉, "더 작은"은 "더 큰"의 5-9 행입니다.
파일 이름을 바꾸면 뭔가 더 복잡해졌습니다. "smaller"가 실제로 "bigger"의 하위 세트를 구성하는 경우 'd'(삭제 용) 명령 만 출력에 표시됩니다.
파일이 충분히 작 으면 Perl에 파일을 넣고 정규식 엔진이 트릭을 수행하도록 할 수 있습니다.
perl -0777e '
open "$FILE1","<","file_1";
open "$FILE2","<","file_2";
$file_1 = <$FILE1>;
$file_2 = <$FILE2>;
print "file_2 is", $file_1 =~ /\Q$file_2\E/ ? "" : "not";
print " a subset of file_1\n";
'
이 -0777스위치는 Perl에게 입력 레코드 구분 기호 $/를 정의되지 않은 값으로 설정하여 파일을 완전히 처리하도록 지시 합니다.
777합니까? NULL을 전달 $/하지만 왜 그럴까요? 또한 이것들은 좀 난해한 스위치이기 때문에 비 펄 사람들에게는 설명이 좋을 것입니다.
$a=<$fh>어쨌든 맞아야합니까?
$/으로 설정 되어 있습니다. 물론 명령 줄 동작에 내가 모르는 다른 기본값이없는 한? \n$a=<$fh>$fhperl
while $foo=<FILE>관용구를 사용 하지 않으므로 확실하지 않고 작동하는 것처럼 보이는 (잘못된) 테스트를 실행했습니다. 신경 쓰지 마 :).
귀하의 질문은 "파일의 차이점"입니다. 하나의 파일이 다른 파일의 헤드라는 것을 의미한다면, 간단한 cmp것이 다음과 같이 알려줄 것입니다.
cmp big_file small_file
cmp: EOF on small_file
그것은 읽는 동안 파일 끝에 도달 할 때까지 두 파일의 차이가 감지되지 않았 음을 나타 small_file냅니다.
그러나 작은 파일의 전체 텍스트가 내부 어디에서나 발생할 수 있다는 것을 의미한다면 big_file메모리에 두 파일을 모두 넣을 수 있다고 가정하면
perl -le '
use autodie;
undef $/;
open SMALL, "<", "small_file";
open BIG, "<", "big_file";
$small = <SMALL>;
$big = <BIG>;
$pos = index $big, $small;
print $pos if $pos >= 0;
'
그러면 big_file내용이 small_file있는 위치 내 오프셋이 인쇄됩니다 (예 : small_file시작 부분에서 일치하는 경우 0 big_file). 경우 small_file내부 일치하지 않는 big_file, 아무 것도 인쇄되지 않습니다. 오류가 있으면 종료 상태는 0이 아닙니다.