# Script grep BASH

**URL:** <https://www.debian-fr.org/t/script-grep-bash/31927>\
**Category:** Programmation\
**Created:** [Février 21, 2016, 1:47 UTC](https://www.debian-fr.org/t/script-grep-bash/31927 "2016-02-21T01:47:44Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![vinced86](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/v/b487fb/32.png) [@vinced86](https://www.debian-fr.org/u/vinced86)\
**Post date:** [Février 21, 2016, 1:47 UTC](https://www.debian-fr.org/t/script-grep-bash/31927/1 "2016-02-21T01:47:44Z")

</div>

Bonjour,  
je dois concevoir un script pour mon entreprise qui check des fichier PHP pour vérifier que le code est bien au norme.  
Dans un premier temps je dois l’expression suivante dans le script PHP des DEV: _$valeur1_$valeur2\_._DNS_  
Le but de jeu est de vérifier que le _._ est bien présent devant DNS.  
Comment faire pour faire un grep de toute les expressions DNS\_ qui ne possède pas le _._ devant??  
Je ne sais pas si j’ai été assez clair!!  
Merci d’avance pour vos réponses. 🙂

---

<div class="post-metadata">

**Author:** ![branch](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/b/ee7513/32.png) [@branch](https://www.debian-fr.org/u/branch)\
**Post date:** [Février 21, 2016, 1:47 UTC](https://www.debian-fr.org/t/script-grep-bash/31927/2 "2016-02-21T01:47:50Z")

</div>

Bonjour,

Tu as une solution assez simple et élégante (enfin je trouve) :

```auto

```

On cherche les occurences du motif DNS\_ qui sont précédées par zéro occurences du motif _._

Bonne journée

---

<div class="post-metadata">

**Author:** ![vinced86](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/v/b487fb/32.png) [@vinced86](https://www.debian-fr.org/u/vinced86)\
**Post date:** [Février 21, 2016, 1:48 UTC](https://www.debian-fr.org/t/script-grep-bash/31927/3 "2016-02-21T01:48:07Z")

</div>

Merci!!!

---

<div class="post-metadata">

**Author:** ![kna](https://www.debian-fr.org/user_avatar/www.debian-fr.org/kna/32/5623_2.png) [@kna](https://www.debian-fr.org/u/kna)\
**Post date:** [Février 21, 2016, 1:48 UTC](https://www.debian-fr.org/t/script-grep-bash/31927/4 "2016-02-21T01:48:12Z")

</div>

Tu peux aussi utiliser [^motif] pour exclure un motif :

```auto

```

devrait donner le même résultat

(j’ai échappé le point au passage, sinon ça représente n’importe quel caractère)

---

<div class="post-metadata">

**Author:** ![branch](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/b/ee7513/32.png) [@branch](https://www.debian-fr.org/u/branch)\
**Post date:** [Février 21, 2016, 1:50 UTC](https://www.debian-fr.org/t/script-grep-bash/31927/5 "2016-02-21T01:50:25Z")

</div>

Pas vraiment en fait le «&nbsp;point&nbsp;» n’a pas de caractère spécial lorsqu’il est dans les crochets. Il signifie juste le caractère «&nbsp;point&nbsp;» normal.

Sinon cette expression régulière laisse passer plein de motifs non-conformes :

`$ cat test.txt
DNS_
a.DNS_
b_DNS_
$ cat test.txt | grep '[^_._]DNS_'
$`

Car ce qu’il y a entre crochets avec un accent circonflexe permet de dire «&nbsp;je veux un caractère qui ne soit ni un underscore, ni un point&nbsp;».

Pour faire quelque chose du même style un peu plus correct, il faudrait faire :

```auto
grep '[^_][^.][^_]DNS_'
```

Et encore, aucune des lignes du fichier «&nbsp;test.txt&nbsp;» n’est détectée (car il y a moins de trois caractères entre le début de la ligne et le motif DNS\_). Pour avoir un résultat totalement correct, il faut faire :

```auto
grep -E '([^_][^.][^_]|^.{0,2})DNS_'
```

afin de gérer les cas ou le motif DNS\_ est précédé de moins de trois caractères avant le début de la ligne.

(J’avais déjà essayé tout ça avant de trouver la solution «&nbsp;élégante&nbsp;» que j’ai donné plus haut ![:mrgreen:](https://www.debian-fr.org/uploads/default/original/1X/cc83e9b583138e48ff45f96609046b06d06c7f9d.gif "Mr. Green") )
