어떻게 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 문자)로 끝나는 일련의 줄로 처리합니다.-P
Perl 정규식 구문
편집: 이 버전은 전체 일치 라인을 인쇄합니다.
grep -o -P -z '(.*)Foo(.*)\n(.*)Bar(.*)' file