grep에서 문자열과 일치하는 줄을 제거하십시오.


2

나는 통과 할 몇 가지 긴 구성 파일을 가지고, 내가보고 싶은 단지 에서 실제로 활동중인 무엇 .conf의 어떤없이 파일 #태그입니다. 나는 라인 출력은 어떻게 사용할 수 없는# 그것에는? 이 명령으로 Debian Wheezy를 실행하고 있습니다.

답변:


2

파일 이름이 foo.conf다음과 같은 경우 :

grep -E '^[^#].*' foo.conf 해야합니다.

설명:

-E: 확장 정규 표현식 지원!

'^[^#].*': 작은 따옴표로 묶은 정규식.

^[^#].*: 정규 표현식 자체.

^(정규 표현식의 위치 0에서) : "줄의 시작 부분에서 시작 / 개행 바로 다음의 첫 문자 또는 파일 자체의 첫 번째 문자와 일치합니다."

[^#]: "캐릭터가 아닌 정확히 한 문자 만 일치 시킵니다 #."

.*: " 나머지 줄에 대해 줄 바꿈을 제외한 모든 문자를 0 개 이상 일치 시킵니다."

결과적으로 다음과 같은 내용의 파일이 있으면 효과가 있습니다.

#foo
bar
#baz
fly

이 정규 표현식은 첫 번째와 세 번째 라인과 일치하지 않습니다 . 첫 번째와 세 번째 라인의 시작에서 첫 번째 문자는 실제로 a #이므로 정확히 하나의 비 #( [^#])가 필요한 정규 표현식의 일부 가 일치하지 않기 때문입니다. grep해당 줄을 제외합니다.

그러면 정규 표현식은 나머지 행 과 일치하게 됩니다. 2 행과 4 행의 시작 부분에있는 첫 문자가 실제로는 아니기 때문 입니다 #.

지금까지의 성공을 바탕으로 다음과 같은 행을 일치시킬 수도 있습니다.

    #I am tricky!

( 주석 앞에 공백 (탭 또는 공백)이 있으며 여전히 주석이므로 원하지 않습니다!)

다음을 사용하여

grep -P '^\s*+[^#].*' foo.conf

(그러나 .*꼭 필요한 것은 아니며 알고 있습니다.)

이제 우리는 :

-P: Perl 호환 정규 표현식 지원 ! (힌트 :의 모든 버전 / 구현에서 보편적으로 사용 가능 grep하지는 않지만, 현재 GNU Grep에서는 한동안 사용할 수 있습니다.)

\s*+: 말한다 추가 정규 표현식의 약간은 "공백이나 탭을 의미하는 0 개 이상의 공백 문자를 일치, 당신이 경우 어떻게 그들을 볼 수, 당신은 그들을 먹을해야합니다." 후자의 부분은 소유 정량자가 없으면 *+공간이의 일부로 일치 [^#]하여 정규 표현식을 속일 수 있기 때문에 매우 중요 합니다. POSIX 호환 (기본 또는 확장) 정규 표현식 플레이버에는 소유 수량자가 없으므로 PCRE를 사용해야합니다. 소유 수량화 도구없이이 작업을 수행하는 방법이있을 수 있지만 잘 모르겠습니다.


1)이를 위해 확장 된 grep이 필요하지 않습니다. 표현은 "비 확장"입니다. . 주석이 요구 사항 3) *이 경우 불필요한의 일부가 아닌 첫 번째 문자 인 경우 2)은 비록 그렙 -o와 때로는 유용 라인을 제거합니다
리치 Homolka

1) 교훈은 배웠다; 네 말이 맞아 2) PCRE 및 소유 정량기를 사용한 업데이트로 수정되었습니다. 그는 conf 파일 파서가 주석으로 간주하는 행을 찾고 있지만 #어딘가에 포함되는 행만이 아닙니다 . 의 댓글 대부분의 파일은와 중 하나를 시작하는 라인이다 #첫 번째 열에서, 또는 A가와 #약간의 공백을 다음과 같습니다. 3) 교훈, 감사합니다.
allquixotic

4
grep -v '#' file

쉘이 주석으로 해석 할 수도 있기 때문에 #을 인용해야합니다.

grep은 #가있는 라인을 제거합니다. 이것은 당신이 원하는 것이 아닐 수도 있습니다. 더 유용한 것은 주석을 제거하는 것입니다. sed 또는 'Stream EDitor'를 사용할 수 있습니다. 이것은 당신이 원하는 것을 줄 수 있습니다.

sed -e 's/#.*//' < file | less

정규 표현식에 "주석 문자를 찾아서 줄 끝까지 찾아서 제거합니다"라고 말한 다음 더 쉽게 읽을 수 있도록 줄이십시오.

주석이 항상 첫 번째 열에있는 경우 @somequixotic에서 작성한대로 첫 번째 열에 주석이없는 행만 표시하는 방법을 사용할 수 있습니다.


이 대답은 잘못된 것입니다. 예를 들어 olol#olol스크립트와 같은 줄 ./baz.sh #this does ...은이 전략과 일치하지 않는 줄과 같은 줄이지 만 내 답변에서 확장 정규 표현식을 사용하면 성공적으로 일치합니다. 이 의견은 최초 의 답변으로이 답변의 텍스트를 기반으로합니다 .)
allquixotic

@ somequixotic 네, 게시 한 후에 생각했습니다. 나는 이미 그것을 편집하고 있었다. 그래도 고마워.
Rich Homolka 16:20에

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