file1
두 개의 파일 이 있고 file2
.
샘플 내용은 다음과 같습니다 file1
.
A B
C D
E F
G H
내용은 file2
이렇습니다.
A B
few other lines
E F
few more other lines
A B
C D
E F
G H
few more other lines
G H
file1
그래서 저는 전체 콘텐츠 블록을 검색하고 싶습니다 file2
. 이는 출력에 다음 행만 포함되어야 함을 의미합니다.
A B
C D
E F
G H
참고:- 함께 그룹화된 행만 출력의 일부가 되어야 합니다.
답변1
grep
여러 줄 패턴의 경우 이는 매우 어리석은 일이지만 \n
패턴과 텍스트의 모든 줄 바꿈을 NUL 문자로 변환한 후 비교하여 검색하면 \0
문제가 해결됩니다. 분명히 \0
출력도 다시 번역되어야 합니다.\n
file1
검색하려는 패턴이 포함되어 있다고 가정하면 명령은 다음과 같습니다 file2
.
grep -aof <(tr '\n' '\0' < file1) <(tr '\n' '\0' < file2) | tr '\0' '\n'
특정 파일의 출력 예:
A B
C D
E F
G H
설명하다:
<(tr '\n' '\0' < file1)
file1
와 동일 하지만 모든 개행 문자가 NUL 문자로 변환된 FIFO/명명된 파이프/임시 파일 클래스 객체를 생성합니다 .<(tr '\n' '\0' < file2)
동일한 작업을 수행하되file2
.grep -f PATTERN_FILE INPUT_FILE
PATTERN_FILE
그것에서 패턴을 검색하십시오INPUT_FILE
.- 플래그는 바이너리 파일 일치를
-a
활성화합니다 .grep
그렇지 않으면 인쇄할 수 없는 문자(예:\0
. -o
플래그는grep
발견된 전체 행이 아닌 일치하는 시퀀스만 인쇄하도록 합니다.| tr '\0' '\n'
왼쪽 명령 출력의 모든 NUL 문자를 다시 개행 문자로 변환합니다.
답변2
아래 코드는 어색하지만 GNU에서는 작동합니다 awk
.
awk -v RS="$(<file1)" '{print RT}' file2
답변3
순수한 배쉬 재미를 위해
mapfile -t <file1
while read line ; do
[ "$line" = "${MAPFILE[i++]}" ] || { ["$line" = "$MAPFILE" ] && i=1 || i=0; }
[ $i -eq ${#MAPFILE[*]} ] && { printf "%s\n" "${MAPFILE[@]}"; i=0; }
done <file2
답변4
어떤 출력을 원하는지 잘 모르겠지만 완전히 라인 지향적이지 않은 언어에서는 쉽게 수행할 수 있습니다(특히 두 파일을 모두 메모리로 읽을 수 있는 경우). 다음은 일치하는 항목의 수를 알려주는 Python 스크립트입니다.
import sys
find = open(sys.argv[1]).read()
hay = open(sys.argv[2]).read()
print("The text occurs", hay.count(find), "times")
file1
일치하는 수를 인쇄하시겠습니까 ? 마지막 줄을 다음으로 바꾸십시오.
print(find * hay.count(find))
정말로 원한다면 모든 것을 명령줄 호출이나 별칭으로 래핑할 수 있습니다.
python -c 'import sys; print("The text occurs", open(sys.argv[2]).read().count(open(sys.argv[1]).read()), "times")' file1 file2