Como escapar “.” com sed ou grep?

6

Eu tenho file com

denm.xyz
denm.abc
denm.def
denm_xyz
denm_abc
denm_def

Eu quero extrair os com . .

Eu tentei

grep "denm\.*" file
grep 'denm\.*' file

sed "/denm\.*/p" file
sed '/denm\.*/p' file

Essas coisas estão combinando tudo no file

No entanto, usando awk

awk '/denm\./' file 

funcionou !!

Como faço o mesmo usando grep ou sed

    
por Ramana Reddy 11.12.2015 / 10:07

4 respostas

13

Você estava perto, só precisa remover * , o que significa zero ou mais correspondência do token anterior, . neste caso. Como resultado, o demn_ também está sendo mostrado no resultado, pois correspondeu à condição de zero . .

Então você pode fazer:

grep 'denm\.' file.txt 

Similarmente, em sed :

sed -n '/denm\./p' file.txt

Observe que você perdeu a opção -n de sed , sem que sed imprima todas as linhas também.

Existem também muitos níveis de precisão que podem ser adicionados para obter exatamente o que você deseja em casos complexos, mas tome isso como um começo.

Exemplo:

% grep 'denm\.' file.txt
denm.xyz
denm.abc
denm.def

% sed -n '/denm\./p' file.txt
denm.xyz
denm.abc
denm.def
    
por heemayl 11.12.2015 / 10:31
7

\.* significa "qualquer número de ocorrências do caractere . ", incluindo zero. Como seus nomes de arquivos sublinhados começam com denm seguidos por zero ocorrências do caractere . , eles são correspondidos. grep "denm\." file funcionará.

    
por fkraiem 11.12.2015 / 10:18
3

Se tudo que você precisa são as linhas que possuem . , use grep com strings fixas ao invés de expressões regulares:

grep -F . file

Em man grep :

-F, --fixed-strings
      Interpret PATTERN as a  list  of  fixed  strings,  separated  by
      newlines,  any  of  which is to be matched.  (-F is specified by
      POSIX.)

Com sequências fixas, todos os caracteres especiais de expressões regulares perdem o significado.

sed não tem uma opção correspondente.

    
por muru 11.12.2015 / 22:00
1

Eu costumo usar colchetes em vez de barras invertidas para escapar:

egrep "denm[.].*" file
sed -r 's/denm[.]/.../'

Isso me poupa do esforço de pensar se e como eu deveria escapar das barras invertidas. (O% final .* é redundante aqui.)

    
por krlmlr 11.12.2015 / 21:49