리터럴 ".."을 grep하는 방법

리터럴 ".."을 grep하는 방법

나는 grep을 사용하여 파일을 구문 분석하고 있으며 화면의 출력에는 다음과 같은 개행 문자가 포함되어 있습니다.

$ grep 'gene' sequence.gb
     gene            89..1483
                     /gene="non-structural protein"
                     /gene="non-structural protein"
                     /gene="non-structural protein"
                     /gene="non-structural protein"
                     /gene="non-structural protein"
                     /gene="non-structural protein"
                     /gene="non-structural protein"
     gene            complement(1987..2763)
                     /gene="nucleocapsid protein"
                     /gene="nucleocapsid protein"

변수에 할당하고 줄 바꿈을 사용하여 인쇄할 수 있습니다.

$ gene=$(grep 'gene' sequence.gb)
echo "$gene"
     gene            89..1483
                     /gene="non-structural protein"
                     /gene="non-structural protein"
                     /gene="non-structural protein"
                     /gene="non-structural protein"
                     /gene="non-structural protein"
                     /gene="non-structural protein"
                     /gene="non-structural protein"
     gene            complement(1987..2763)
                     /gene="nucleocapsid protein"
                     /gene="nucleocapsid protein"

하지만 여기에는 실제 개행 문자가 포함되지 않습니다. '..'가 포함된 줄을 다시 검색하면 모두 얻을 수 있기 때문입니다.

$ echo "$gene" | grep '..'
     gene            89..1483
                     /gene="non-structural protein"
                     /gene="non-structural protein"
                     /gene="non-structural protein"
                     /gene="non-structural protein"
                     /gene="non-structural protein"
                     /gene="non-structural protein"
                     /gene="non-structural protein"
     gene            complement(1987..2763)
                     /gene="nucleocapsid protein"
                     /gene="nucleocapsid protein"

이는 따옴표가 없는 단일 문자열임을 알 수 있습니다.

$ echo $gene
gene 89..1483 /gene="non-structural protein" /gene="non-structural protein" /gene="non-structural protein" /gene="non-structural protein" /gene="non-structural protein" /gene="non-structural protein" /gene="non-structural protein" gene complement(1987..2763) /gene="nucleocapsid protein" /gene="nucleocapsid protein"

제 질문은 개행 형식을 어떻게 유지하거나 도입할 수 있느냐는 것입니다.

감사해요

답변1

.이는 정규식 와일드카드이므로 두 grep '..'개 이상의 문자가 포함된 모든 줄과 일치합니다.

$ echo "$gene" | grep '..'
     gene            89..1483
                     /gene="non-structural protein"
                     /gene="non-structural protein"
                     /gene="non-structural protein"
                     /gene="non-structural protein"
                     /gene="non-structural protein"
                     /gene="non-structural protein"
                     /gene="non-structural protein"
     gene            complement(1987..2763)
                     /gene="nucleocapsid protein"
                     /gene="nucleocapsid protein"

정규식에서는 .정말 말도 안되는 일입니다. 문자나 숫자뿐만 아니라 구두점, 공백, 탭 또는 기타 모든 문자와도 일치합니다.

마침표만 일치시키려면 다음을 사용하십시오 -F.

$ echo "$gene" | grep -F '..'
     gene            89..1483
     gene            complement(1987..2763)

-F패턴을 정규 표현식이 아닌 고정 문자열로 처리하도록 --fixed-strings지시하는 약어입니다 .grep

또는 마침표만 일치하도록 마침표를 이스케이프할 수 있습니다(팁:):

$ echo "$gene" | grep '\.\.'
     gene            89..1483
     gene            complement(1987..2763)

grep또는 마침표를 문자 클래스에 넣어서 마침표를 문자 그대로의 마침표로 처리하도록 강제 할 수 있습니다 (팁:데이브 톰슨):

$ echo "$gene" | grep '[.][.]'
     gene            89..1483
     gene            complement(1987..2763)

그러나 정규식이 필요하지 않은 경우 정규식을 사용 하면 프로세스가 더 빨라 -F집니다 .grep

관련 정보