다음과 같은 구조의 파일이 있습니다.
[Term]
id: GO:0000001
name: mitochondrion inheritance
namespace: biological_process
def: "The distribution of mitochondria, including the mitochondrial genome, into daughter cells after mitosis or meiosis, mediated by interactions between mitochondria and the cytoskeleton." [GOC:mcc, PMID:10873824, PMID:11389764]
synonym: "mitochondrial inheritance" EXACT []
is_a: GO:0048308 ! organelle inheritance
is_a: GO:0048311 ! mitochondrion distribution
이 구조는 사전처럼 여러 번 반복됩니다. 각 정의는 빈 줄 바꿈으로 시작 [Term]
하고 후속 정의와 구분됩니다. 모든 정의가 로 시작하는 줄로 끝나는 것은 아닙니다 is_a
. 일부 용어를 grep하고 전체 정의를 검색하고 싶기 때문에 [Term]
null 개행, 즉 이전에 표시된 구조 예제가 결과가 될 수 있습니다 grep -i "mitochondria" myfile
. 어떻게 해야 합니까? 정의당 줄 수는 고정되어 있지 않으며 정의의 어느 지점에서나 일치할 수 있습니다.
이것이 적합한 도구 인지 잘 모르겠습니다 grep
. 문제는 몇 단어를 한 번에 일치시키고 싶어서 를 사용하기 시작했다는 것입니다 grep -i -e "match" -e "someothermatch"
.regex
저는 Windows 환경에서 Cygwin을 사용하고 있으며 분명히 PCRE를 지원합니다.
답변1
귀하의 설명에 따르면(강조):
[*Term*]
모든 정의는 and로 시작됩니다.
빈 줄 바꿈으로 다음과 구분됩니다.
null RS( )를 사용하여 awk를 호출하면 RS=''
파일이 빈 줄로 분할됩니다.
문자열을 기준으로 선택할 수도 있습니다.
$ var="someothermatch"
$ awk -v RS='' -v var="$var" '$0~var{print}' infile
얻기 위해 노력해야 한다전체 단락그 게임.
awk 매뉴얼에서:
RS가 빈 문자열로 설정된 경우 레코드는 빈 줄로 구분됩니다. RS가 빈 문자열로 설정되면 개행 문자는 FS가 가질 수 있는 값 외에 항상 필드 구분 기호 역할을 합니다.