연속된 두 줄의 내용을 기반으로 디렉토리를 파악하는 방법은 무엇입니까?

연속된 두 줄의 내용을 기반으로 디렉토리를 파악하는 방법은 무엇입니까?

어떻게 grep할 수 있나요?목차"Foo"가 포함된 행의 경우오직다음 줄에 "Bar"도 포함되어 있으면 일치 항목을 얻으시겠습니까?

답변1

@warl0ck가 나에게 올바른 방향을 알려줬지만 pcregrep나는 "is"가 아니라 "includes"라고 말했고 파일이 아닌 디렉터리에 대해 묻고 있었습니다.

이것은 나에게 효과적인 것 같습니다.

pcregrep -rMi 'Foo(.*)\n(.*)Bar' .

답변2

grep은 기본적으로 이를 지원하지 않는 것 같습니다. 대신 pcregrep을 사용하십시오.

Foo
Bar
Foo
abc

pcregrep -M "Foo\nBar" file

얻다:

Foo
Bar

답변3

sed스크립트 사용 :

#!/bin/sed -nf

/^Foo/{
    h         # put the matching line in the hold buffer
    n         # going to nextline
    /^Bar/{   # matching pattern in newline
        H     # add the line to the hold buffer
        x     # return the entire paragraph into the pattern space
        p     # print the pattern space
        q     # quit the script now
    }
}

그걸 써:

chmod +x script.sed
printf '%s\n' * | ./script.sed

여기의 각 줄은 printf현재 디렉터리의 모든 파일을 표시하고 이를 sed.

노트: 알파벳 순으로 정렬되어 있습니다.

pattern space더 유용한 정보hold space 여기.

반짝임 웹사이트프로그래밍 에는 정말 좋은 것들이 많이 있습니다 shell.

답변4

나는 Nathan의 솔루션을 선호하지만 pcregrep여기에는 grep만을 사용하는 솔루션이 있습니다.

grep -o -z -P  'Foo(.*)\n(.*)Bar' file

옵션 설명:

  • -o일치하는 부분만 인쇄됩니다. include는 전체 파일을 인쇄하기 때문에 필요합니다 -z(어딘가에 \0이 없는 경우).
  • -z입력을 줄 바꿈 문자 대신 0바이트(ASCII NUL 문자)로 끝나는 일련의 줄로 처리합니다.
  • -PPerl 정규식 구문

편집: 이 버전은 전체 일치 라인을 인쇄합니다.

    grep -o -P -z  '(.*)Foo(.*)\n(.*)Bar(.*)' file

관련 정보