특수 표현식을 사용한 grep

특수 표현식을 사용한 grep

.c내 디렉토리에 일부 이진 파일과 일부 확장 파일이 있습니다.

여기서 출력은 다음을 사용합니다.ls

arrays.c basic0 basic0.c fromfb fromfb.c oute oute.c segmen.c simp simp.c

여기서는 바이너리 파일만 필터링하고 싶기 때문에 다음을 사용합니다.

ls |grep -v .c

이 명령은 모든 파일을 나열한 다음 grepI를 사용하여 .c로 끝나지 않는 파일을 제외한 파일을 가져옵니다.

내가 기대했던 것은

basic0
fromfb
oute
simp

하지만 내가 얻은 건

fromfb
oute
simp

basic0 바이너리가 누락되었습니다. 이게 무슨 문제야?

답변1

~에 따르면man grep

기간. 단일 문자와 일치합니다.

따라서 grep .c다음 문자와 일치합니다.c

당신은 찾고 있거나 grep -v \.c더 나은 것일 수도 있습니다grep -v '\.c$'

어디

  • \.탈출의 특별한 의미.
  • c
  • $줄 끝(ls로 파이프되면 파일 이름 출력)

와일드카드에서 알 수 있듯이 grep -vF .c-F플래그를 사용하여 grep에게 정규식 대신 간단한 문자열로 arg를 사용하도록 지시할 수도 있습니다.

답변2

마침표를 벗어나려면 "\."를 사용해야 합니다. ls | grep -v "\.c$".execute를 사용해 보세요. grep -v .c해당 문자가 포함되지 않은 모든 레코드를 참조합니다. 다른 문자 앞에

답변3

남성

man grep우리에게 말해주세요

기간. 단일 문자와 일치합니다.

이는 .c임의의 단일 문자와 일치하고 그 뒤에 오는 것을 의미합니다.. 표현식을 고정하지 않았으므로 뒤에 문자가 포함된 모든 문자열과 일치합니다..

테스트해 보겠습니다. 깃발 을 사용하지 않으면 -v어떻게 되나요 ?

시험

보자. 먼저 테스트를 설정했습니다.

~ $ mkdir test
~ $ cd test
~/test $ touch arrays.c
~/test $ touch basic0
~/test $ touch basic0.c
~/test $ touch fromfb
~/test $ touch fromfb.c
~/test $ touch oute
~/test $ touch oute.c
~/test $ touch segmen.c
~/test $ touch simp
~/test $ touch simp.c
~/test $ ls
arrays.c  basic0.c  fromfb.c  oute.c    simp
basic0    fromfb    oute      segmen.c  simp.c

그런 다음 테스트합니다 ls | grep .c.

~/test $ ls|grep .c
arrays.c
basic0
basic0.c
fromfb.c
oute.c
segmen.c
simp.c

보시다시피 예상되는 C 소스 코드가 일치할 뿐만 아니라 바이너리 basic0도 일치합니다. 이것.와 일치(놀랍지도 않게) 일치합니다 c.

해결책

C 소스를 일치시켜 제외하려고 합니다. 이 파일은 다음으로 끝납니다.. 씨, 그래서 우리는 grep에게 이것과 일치하도록 지시합니다.

~/test $ ls|grep "\.c$"
arrays.c
basic0.c
fromfb.c
oute.c
segmen.c
simp.c

우리는 여기서 두 가지 일을 합니다. 먼저, 우리는 점을 탈출하여 그것을 만들었습니다.텍스트 포인트"단일 문자"가 아닌. 그러나 이는 여전히 foo.c.bar대상일 수도 있고 아닐 수도 있는 이름의 파일과 일치합니다 .
그렇지 않다고 가정하면 c를 마지막 문자로 수정합니다. 이제 문자열을 일치시키고 있습니다.점과.

재적용은 -v독자의 연습 문제로 남겨 둡니다.

관련 정보