"Foo"가 포함 된 줄 의 디렉토리 를 어떻게 grep 할 수 있습니까? 다음 줄에도 "Bar"가있을 때만 일치합니까?
"Foo"가 포함 된 줄 의 디렉토리 를 어떻게 grep 할 수 있습니까? 다음 줄에도 "Bar"가있을 때만 일치합니까?
답변:
Grep 자체는이를 지원하지 않는 것 같습니다. 대신 pcregrep을 사용하십시오.
Foo
Bar
Foo
abc
pcregrep -M "Foo\nBar" file
있어 :
Foo
Bar
Foo
및 Bar
전체 라인을 포함하는 것입니다.
A의 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
여기에 대한 더 많은 정보 .
grymoire.com 은 shell
프로그래밍 에 대한 좋은 점이 있습니다 .
h, n, H, x, p, q
의미합니까? 매우 흥미로운.
pattern space
& hold space
: grymoire.com/Unix/Sed.html#uh-56 또는 프랑스어에서 commentcamarche.net/faq/9536-sed-introduction-a-sed-part-i
다음을 사용 grep
하여 다음 파이프를 구성 할 수 있습니다.
grep -A1 'Foo' input_file | grep -B1 'Bar' | grep 'Foo'
첫 번째 grep
는 Foo
일치하는 줄뿐만 아니라 포함 된 모든 줄을 가져옵니다 . 그런 다음 Bar
일치하기 전에 줄뿐만 아니라 포함 하는 줄을 가져 와서이 출력에서을 포함하는 줄을 추출합니다 Foo
.
편집 : 로 manatwork는 지적의 관찰력이 될 몇 가지 문제가있는 경우가 있습니다. grep
라인 지향 기능 으로 인해 흥미로운 과제가 있지만 , 그 솔루션을 사용하는 솔루션은 '해킹'이 될 수 있으며 pcregrep
현재 작업에 더 적합한 것을 사용하는 것이 좋습니다 .
find . -name '*.txt' | xargs grep -A1 'Foo' | grep -B1 'Bar'
을 사용하는 Nathan의 솔루션을 선호하지만 pcregrep
grep 만 사용하는 솔루션이 있습니다.
grep -o -z -P 'Foo(.*)\n(.*)Bar' file
옵션 설명 :
-o
일치하는 부분 만 인쇄하십시오. 포함 후 필요한 -z
전체 파일을 인쇄합니다 (어딘가에 \ 0이없는 경우)-z
입력을 행 세트로 취급하십시오. 각 행은 개행 대신 0 바이트 (ASCII NUL 문자)로 종료됩니다.-P
펄 정규식 구문 편집 :이 버전은 일치하는 전체 줄을 인쇄합니다
grep -o -P -z '(.*)Foo(.*)\n(.*)Bar(.*)' file
-z
. 전체 표현식 전후에 일부 "(. *)"는 일치하는 전체 행을 출력합니다. 현재는 "Foo"앞과 "Bar"뒤에 하위 문자열이 표시되지 않습니다.