web-dev-qa-db-fra.com

Comment s'échapper "." avec sed ou grep?

J'ai file avec

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

Je veux extraire ceux avec . dedans.

J'ai essayé

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

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

Ces choses correspondent à tout dans le file

Cependant, en utilisant awk

awk '/denm\./' file 

travaillé!!

Comment faire de même en utilisant grep ou sed

6
Ramana Reddy

Vous étiez proches, il vous suffit de supprimer *, ce qui signifie une correspondance égale ou supérieure au jeton précédent, . dans ce cas. En conséquence, le demn_ apparaît également dans le résultat car il correspond à la condition de zéro ..

Alors tu peux faire:

grep 'denm\.' file.txt 

De même dans sed:

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

Notez que vous avez manqué l'option -n de sed, sans elle sed, toutes les lignes seront également imprimées.

Il existe également de nombreux niveaux de précision pouvant être ajoutés pour obtenir exactement ce que vous voulez dans des cas complexes, mais prenez-le comme point de départ.

Exemple:

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

% sed -n '/denm\./p' file.txt
denm.xyz
denm.abc
denm.def
13
heemayl

\.* signifie "n'importe quel nombre d'occurrences du caractère .", y compris zéro. Comme les noms de fichiers soulignés commencent par denm, suivis de zéro, le caractère ., ils correspondent. grep "denm\." file fonctionnera.

7
fkraiem

Si vous avez uniquement besoin des lignes contenant un _._, utilisez grep avec des chaînes fixes au lieu d'expressions régulières:

_grep -F . file
_

De 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.)
_

Avec des chaînes fixes, tous les caractères spéciaux d'expression régulière perdent leur signification.

sed n'a pas d'option correspondante.

3
muru

J'ai tendance à utiliser des crochets au lieu de barres obliques inverses pour m'échapper:

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

Cela me épargne l’effort de penser si et comment je devrais échapper aux antislashs. (La version finale _.*_ est redondante ici.)

1
krlmlr