답변:
파일 이름이 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를 사용해야합니다. 소유 수량화 도구없이이 작업을 수행하는 방법이있을 수 있지만 잘 모르겠습니다.
#
어딘가에 포함되는 행만이 아닙니다 . 의 댓글 대부분의 파일은와 중 하나를 시작하는 라인이다 #
첫 번째 열에서, 또는 A가와 #
약간의 공백을 다음과 같습니다. 3) 교훈, 감사합니다.
grep -v '#' file
쉘이 주석으로 해석 할 수도 있기 때문에 #을 인용해야합니다.
grep은 #가있는 라인을 제거합니다. 이것은 당신이 원하는 것이 아닐 수도 있습니다. 더 유용한 것은 주석을 제거하는 것입니다. sed 또는 'Stream EDitor'를 사용할 수 있습니다. 이것은 당신이 원하는 것을 줄 수 있습니다.
sed -e 's/#.*//' < file | less
정규 표현식에 "주석 문자를 찾아서 줄 끝까지 찾아서 제거합니다"라고 말한 다음 더 쉽게 읽을 수 있도록 줄이십시오.
주석이 항상 첫 번째 열에있는 경우 @somequixotic에서 작성한대로 첫 번째 열에 주석이없는 행만 표시하는 방법을 사용할 수 있습니다.
olol#olol
스크립트와 같은 줄 ./baz.sh #this does ...
은이 전략과 일치하지 않는 줄과 같은 줄이지 만 내 답변에서 확장 정규 표현식을 사용하면 성공적으로 일치합니다. 이 의견은 최초 의 답변으로이 답변의 텍스트를 기반으로합니다 .)