grep은 file2에서 정확한 라인 블록(file1의 내용)을 추출합니다.

grep은 file2에서 정확한 라인 블록(file1의 내용)을 추출합니다.

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_FILEPATTERN_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

관련 정보