grep com expressões especiais [duplicado]

2

Eu tenho alguns binários e alguns arquivos de extensão .c no meu diretório.

Aqui a saída usando ls

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

Aqui eu quero filtrar apenas arquivos binários, então eu uso

ls |grep -v .c

Este comando lista todos os arquivos, Então, usando grep eu recebo arquivos, exceto aqueles arquivos que não terminam com .c

O que eu espero é

basic0
fromfb
oute
simp

Mas o que eu tenho

fromfb
oute
simp

arquivo binário basic0 faltando. Qual é o problema com isso?

    
por SuperKrish 10.11.2016 / 13:21

3 respostas

10

Como por man grep

The period . matches any single character.

assim, grep .c corresponde a qualquer caractere seguido por c

Você pode estar procurando por grep -v \.c ou melhor grep -v '\.c$'

onde

  • \. evita significado especial de.
  • c
  • $ fim da linha (quando canalizado para ls emite um par de nome de arquivo)

como sugerido pelo caractere curinga, você também pode usar grep -vF .c O -F sinalizador diz ao grep para usar o arg como uma string simples, não a expressão regular.

    
por 10.11.2016 / 13:25
1

Você precisa escapar do sinal de ponto com "\.". Experimente com ls | grep -v "\.c$" . Executar grep -v .c significa qualquer registro que não contenha o caractere c precedido por outro caractere

    
por 10.11.2016 / 13:27
1

man

man grep nos diz que

The period . matches any single character.

Isso significa que .c corresponde a qualquer caractere único seguido por um c . Como você não ancorou sua expressão, isso corresponde a qualquer string que contenha qualquer caractere seguido por um c .

Vamos testar isso. E se não usarmos o sinal -v ?

teste

Vamos ver. Primeiro, montamos um teste

~ $ 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

Em seguida, testamos ls | grep .c :

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

Como você pode ver, não apenas as fontes C pretendidas correspondem, mas o arquivo binário basic0 também corresponde. O i é correspondido pelo . e o c é correspondido por (não é surpresa aqui) o c .

solução

Você deseja corresponder fontes C para excluí-las. Esses arquivos terminam com .c , então nós dizemos ao grep para combinar com eles.

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

Nós fizemos duas coisas aqui. Primeiro, escapamos do ponto, para torná-lo um ponto literal em vez de "qualquer caractere único". Mas isso ainda corresponderia a um arquivo chamado foo.c.bar , que pode ou não ser seu objetivo.
Assumindo que não é, também ancoramos o c para ser o último caractere. Agora você está combinando as seqüências de caracteres que terminam com um ponto e um c .

A reaplicação de -v é deixada como um exercício para o leitor.

    
por 10.11.2016 / 18:08