"|"를 사용하여 grepping 대체 연산자


96

다음은 AT5G60410.gff라는 큰 파일의 샘플입니다.

Chr5    TAIR10  gene    24294890    24301147    .   +   .   ID=AT5G60410;Note=protein_coding_gene;Name=AT5G60410
Chr5    TAIR10  mRNA    24294890    24301147    .   +   .   ID=AT5G60410.1;Parent=AT5G60410;Name=AT5G60410.1;Index=1
Chr5    TAIR10  protein 24295226    24300671    .   +   .   ID=AT5G60410.1-Protein;Name=AT5G60410.1;Derives_from=AT5G60410.1
Chr5    TAIR10  exon    24294890    24295035    .   +   .   Parent=AT5G60410.1
Chr5    TAIR10  five_prime_UTR  24294890    24295035    .   +   .   Parent=AT5G60410.1
Chr5    TAIR10  exon    24295134    24295249    .   +   .   Parent=AT5G60410.1
Chr5    TAIR10  five_prime_UTR  24295134    24295225    .   +   .   Parent=AT5G60410.1
Chr5    TAIR10  CDS 24295226    24295249    .   +   0   Parent=AT5G60410.1,AT5G60410.1-Protein;
Chr5    TAIR10  exon    24295518    24295598    .   +   .   Parent=AT5G60410.1

grep을 사용하여 특정 줄을 추출하는 데 문제가 있습니다. 세 번째 열에 지정된 "gene"유형 또는 "exon"유형의 모든 줄을 추출하고 싶었습니다. 이것이 작동하지 않을 때 나는 놀랐습니다.

grep 'gene|exon' AT5G60410.gff

결과가 반환되지 않습니다. 내가 어디로 잘못 갔습니까?


8
egrep대신 시도하십시오 .
Keith

egrep은 Perl이 사용하는 정규식에 더 가깝습니까? (이것은 내가 전에 사용한 것입니다)
MattLBeck

답변:


136

이스케이프해야합니다 |. 다음이 작업을 수행해야합니다.

grep "gene\|exon" AT5G60410.gff

argh, 방금 grep에서 사용하기 위해 잘못된 정규식 자습서를 따르고 있음을 깨달았습니다. 어디에서도 좋은 grep을 찾을 수없는 것 같습니다. 감사합니다!
MattLBeck 2011

51

기본적으로 grep은 이스케이프되지 않는 한 일반 특수 문자를 일반 문자로 취급합니다. 따라서 다음을 사용할 수 있습니다.

grep 'gene\|exon' AT5G60410.gff

그러나 다음 양식을 사용하여 예상 한 작업을 수행하여 모드를 변경할 수 있습니다.

egrep 'gene|exon' AT5G60410.gff
grep -E 'gene|exon' AT5G60410.gff

28

이것은 몇 가지 선택에 대한 다른 방법입니다.

grep -e gene -e exon AT5G60410.gff

-e스위치 지정 다른 패턴이 일치합니다.


이제 질문은 무엇이 더 빠릅니까? 아는 사람 있나요?
Stalinko

1
@stalinko : time명령을 사용하여 알아낼 수 있어야합니다 .
Nathan Fellman 2014-06-07

2

이것은 작동합니다 :

grep "gene\|exon" AT5G60410.gff

2
어떤 값을 이 답변이 어떤 있습니까 stackoverflow.com/a/6775943/3933332이 없다?
Rizier123

3
@ Rizier123-타임 스탬프를보세요. 둘 다 거의 동일한 시간에 동일한 답변으로 답변되었습니다.
xmnboy

예, 1 분 늦었습니다. 그래도 찬성 답변과 동일한 답변은 삭제하겠습니다. 특히 내 벨트 아래에서 40k 명성이 있었다면.
Attila Csipak

0

정규식에서 대체 연산자를 사용 하는 명령에 파이프 명령 을 포함하는 특정 문제를 검색하는 동안이 질문을 찾았 grep으므로 더 전문적인 답변을 제공 할 것이라고 생각했습니다.

내가 직면 한 오류 는 grep 정규식 |의 대체 연산자 (즉, |파이프 연산자와 동일 )가 아닌 이전 파이프 연산자 (예 :)에서 발생한 것으로 밝혀졌습니다 . 나에게 대답 은 문제가 교대 연산자와 관련된 내 grep 정규식에 있다고 가정하기 전에 &와 같은 필요한 특수 쉘 문자 로 적절하게 이스케이프하고 인용하는 것이 었습니다.

예를 들어, 로컬 컴퓨터에서 실행 한 명령은 다음과 같습니다.

get http://localhost/foobar-& | grep "fizz\|buzz"

이 명령으로 인해 다음 오류가 발생했습니다.

-bash: syntax error near unexpected token `|'

이 오류는 내 명령을 다음으로 변경하여 수정되었습니다.

get "http://localhost/foobar-&" | grep "fizz\|buzz"

&큰 따옴표로 문자 를 이스케이프함으로써 문제를 해결할 수있었습니다. 대답은 대체 작업과 전혀 관련이 없습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.