줄에 문자열이 포함되어 있으면 Grep은 전체 .txt 파일을 유지(출력)합니다.

줄에 문자열이 포함되어 있으면 Grep은 전체 .txt 파일을 유지(출력)합니다.

알아요

grep -rhI "# Active" > out.txt 

출력에는 # Active검색 디렉터리의 모든 줄이 포함되지만 전체 .txt 파일 내용이 필요하므로 예를 들어 보겠습니다.

예.txt

Line1 
Line2
Line3 # Active
Line4
Line5
etc

따라서 grep을 수행하면 이러한 .txt 파일에 포함된 줄 뿐만 아니라 다른 모든 줄도 # Active출력되기를 원합니다 .# Active

출력.txt

Line1 
Line2
Line3 # Active
Line4
Line5
etc

답변1

GNU가 아닌 버전의 경우 grep사용할 수 없거나 -z이식성이 필요한 경우...

grep -q pattern file && cat file

-q모든 출력을 억제하지만 일반적으로 종료 상태는 패턴 일치가 발견되었는지 여부에 따라 설정됩니다. 패턴 일치가 발견되면 grep성공 코드가 반환됩니다 0.진짜cat명령 실행을 허용합니다 .

답변2

일반적으로 grep은 일치하는 줄만 표시합니다.

$ grep -rhI "# Active"
Line3 # Active

전체 파일을 보려면 다음 플래그를 추가하세요 -z.

$ grep -rhIz "# Active"
Line1 
Line2
Line3 # Active
Line4
Line5
etc

-zgrep에게 개행 문자를 "줄" 구분 기호로 사용하지 않고 NUL 문자를 사용하도록 지시하는 GNU 확장입니다. 텍스트 파일에는 일반적으로 NUL 문자가 포함되어 있지 않으므로 grep이 전체 파일을 단일 "라인"인 것처럼 읽도록 지시합니다. 따라서 일치하는 항목이 있으면 전체 파일이 인쇄됩니다.

BSD/OSX 버전의 grep에서는 NUL 입력 옵션을 사용할 수 없으며 -z다른 의미가 있습니다.

기타 grep 옵션

-rgrep에게 파일과 디렉터리를 재귀적으로 검색하도록 지시합니다.

-Igrep에게 바이너리 파일을 무시하도록 지시

-h파일 이름을 추가하지 않고 일치하는 항목을 인쇄하도록 grep에 지시합니다.

답변3

sed선택하다:

sed -e 'H;1h;/PATTERN/!d;x;:do' -e 'n;b do' infile

스크립트는 h일치하는 라인을 만날 때까지 이전 버퍼에 라인을 축적하고 삭제하는 방식으로 작동합니다. 이 지점에서 더 이상 입력이 없을 때까지 x버퍼를 변경하고 실행 n(즉, 인쇄하고 다음 라인을 가져옵니다)합니다.

답변4

여러 파일에 대해 이 작업을 수행하려면 다음을 수행하세요.

cat `grep -rIl "# Active" *`

Grep은 파일 이름 목록을 반환하고 cat은 이를 인쇄합니다.

관련 정보