# \[Résolu\] \[SHELL\] suppression de lignes dans un fichier

**URL:** <https://www.debian-fr.org/t/resolu-shell-suppression-de-lignes-dans-un-fichier/10168>\
**Category:** Programmation\
**Created:** [Février 20, 2016, 4:37 UTC](https://www.debian-fr.org/t/resolu-shell-suppression-de-lignes-dans-un-fichier/10168 "2016-02-20T16:37:31Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![dexmon](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/d/d2c977/32.png) [@dexmon](https://www.debian-fr.org/u/dexmon)\
**Post date:** [Février 20, 2016, 4:37 UTC](https://www.debian-fr.org/t/resolu-shell-suppression-de-lignes-dans-un-fichier/10168/1 "2016-02-20T16:37:31Z")

</div>

Salut,  
je cherche le moyen de supprimer des lignes dans un fichier, en fait je voudrais supprimer un virtualhost apache avec un simple script shell mais apparemment je n’y arrive pas.

Le fichier des virtualhost apache rassemble plusieurs virtualhost en commençant par

`<VirtualHost *:80>
ServerName toto.domaine.com
ServerAdmin webmaster@domain.com
DocumentRoot /var/www/vhosts/pseudo
[...]
CustomLog /var/log/apache2/toto-access.log combined
LogLevel warn
ErrorLog /var/log/apache2/toto-error.log
[...]
</VirtualHost>`

Je voudrais simplement lancer un script qui efface le virtualhost qui correspond au pseudo que j’ai indiqué en variable $USER  
donc si j’indique dans le script le pseudo toto et bien il me supprime le virtualhost qui correspond à [toto.domain.com](http://toto.domain.com)

Bref, je voudrais qu’il supprime tout le bloc (de à ), quand le pseudo correspond.  
Note: le nombre de lignes dans le bloque du vhost est fixe.

Est-ce que c’est possible ? et si oui quelles sont les commandes à utiliser.  
merci de votre aide.

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 20, 2016, 4:37 UTC](https://www.debian-fr.org/t/resolu-shell-suppression-de-lignes-dans-un-fichier/10168/2 "2016-02-20T16:37:33Z")

</div>

```auto
Si tu n'indique pas de fichier il prend l'entrée standard et tu peut faire une redirection de flux. :laughing:
```

Si tu n’indique pas de fichier il prend l’entrée standard et tu peut faire une redirection de flux. 😆

---

<div class="post-metadata">

**Author:** ![dexmon](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/d/d2c977/32.png) [@dexmon](https://www.debian-fr.org/u/dexmon)\
**Post date:** [Février 20, 2016, 4:37 UTC](https://www.debian-fr.org/t/resolu-shell-suppression-de-lignes-dans-un-fichier/10168/3 "2016-02-20T16:37:33Z")

</div>

voici ce que j’avais fait:

`#!/bin/sh
echo "Quel VirtualHost voulez-vous supprimer ? : "
read USER
sed -i '/<VirtualHost/{:a; N; /<\/VirtualHost/!ba; /'$USER'\.domaine.com/d}' /root/test.conf
exit 0`  
mais le bloque n’est pas supprimé  
J’ai testé ta commande en indiquant le nom du fichier et  
il m’affiche le fichier complet dans la console (sdout)

---

<div class="post-metadata">

**Author:** ![micky979](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/d9b06d/32.png) [@micky979](https://www.debian-fr.org/u/micky979)\
**Post date:** [Février 20, 2016, 4:37 UTC](https://www.debian-fr.org/t/resolu-shell-suppression-de-lignes-dans-un-fichier/10168/4 "2016-02-20T16:37:39Z")

</div>

Bonjour,

Ceci devrait répondre à ta demande. Ce n’est certainement pas optimisé.

Une petite sauvegarde du fichier Vhost est peut etre preferable.

[code]#!/bin/bash

# Chemin vers le fichier

FICHIER="/chemin/vers/fichier/VHOST"

VHOST\_ASUPP=$[1.domaine.com](http://1.domaine.com)

# Recherche de la ligne contenant le domaine et soustraction de 1

DEB\_LIGNE=$((`grep -n $VHOST_ASUPP $FICHIER | awk -F":" '{print $1}'`-1))

# Suppression des lignes de DEB\_LIGNE jusqu’au premier VirtualHost trouvé

sed -i "$DEB\_LIGNE,/\</VirtualHost\>/"d $FICHIER[/code]

@+

---

<div class="post-metadata">

**Author:** ![dexmon](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/d/d2c977/32.png) [@dexmon](https://www.debian-fr.org/u/dexmon)\
**Post date:** [Février 20, 2016, 4:37 UTC](https://www.debian-fr.org/t/resolu-shell-suppression-de-lignes-dans-un-fichier/10168/5 "2016-02-20T16:37:39Z")

</div>

Salut micky,  
voici ce que ça donne:

`./delvhost.sh: line 9: 2
3
8
9-1: syntax error in expression (error token is "3
8
9-1")
sed: -e expression n°1, caractère 1: commande inconnue: `,'`

Voici le fichier de vhosts (/root/vhosts.conf):

[code]\<VirtualHost \*:80\>  
ServerName [toto.domain.com](http://toto.domain.com)  
ServerAdmin [webmaster@domain.com](mailto:webmaster@domain.com)  
DocumentRoot /var/www/vhosts/toto/

\<VirtualHost \*:80\>  
ServerName [tata.domain.com](http://tata.domain.com)  
ServerAdmin [webmaster@domain.com](mailto:webmaster@domain.com)  
DocumentRoot /var/www/vhosts/tata/  
[/code]

Je voudrais supprimer le vhost [toto.domain.com](http://toto.domain.com)

---

<div class="post-metadata">

**Author:** ![dexmon](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/d/d2c977/32.png) [@dexmon](https://www.debian-fr.org/u/dexmon)\
**Post date:** [Février 20, 2016, 4:37 UTC](https://www.debian-fr.org/t/resolu-shell-suppression-de-lignes-dans-un-fichier/10168/6 "2016-02-20T16:37:39Z")

</div>

J’ai modifier le script comme ceci:

[code]#!/bin/bash

echo "Quel vhosts voulez-vous supprimer ? : "  
read USER

# Chemin vers le fichier

FICHIER="/root/vhosts.conf"

VHOST\_ASUPP=$[USER.domain.com](http://USER.domain.com)

# Recherche de la ligne contenant le domaine et soustraction de 1

DEB\_LIGNE=$((`grep -n $VHOST_ASUPP $FICHIER | awk -F":" '{print $USER}'`-1))

# Suppression des lignes de DEB\_LIGNE jusqu’au premier VirtualHost trouvé

sed -i ‘/$DEB\_LIGNE/\</VirtualHost\>/d’ $FICHIER[/code]

et je rencontre ces erreurs:

`./delvhost.sh: line 12: 2: ServerName toto.domain.com-1: syntax error in expression (error token is ": ServerName toto.domain.com-1")
sed: -e expression n°1, caractère 13: commande inconnue: `<'`

Quelqu’un voit ce qu’il se passe ?

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 20, 2016, 4:37 UTC](https://www.debian-fr.org/t/resolu-shell-suppression-de-lignes-dans-un-fichier/10168/7 "2016-02-20T16:37:42Z")

</div>

Pour la technique avec grep il faut faire quelque chose du genre.

`grep -v -A $NbLigne "$USER" nomfic > nomfic.tmp
mv nomfic.tmp nomfic.tmp`

---

<div class="post-metadata">

**Author:** ![micky979](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/d9b06d/32.png) [@micky979](https://www.debian-fr.org/u/micky979)\
**Post date:** [Février 20, 2016, 4:37 UTC](https://www.debian-fr.org/t/resolu-shell-suppression-de-lignes-dans-un-fichier/10168/8 "2016-02-20T16:37:43Z")

</div>

Bonjour,

Voici la correction :

[code]#!/bin/bash

echo "Quel vhosts voulez-vous supprimer ? : "  
read USER

# Chemin vers le fichier

FICHIER="/root/vhosts.conf"

VHOST\_ASUPP=$[USER.domain.com](http://USER.domain.com)

# Recherche de la ligne contenant le domaine et soustraction de 1

DEB\_LIGNE=$((`grep -n $VHOST_ASUPP $FICHIER | awk -F":" '{print $1}'`-1))

# Suppression des lignes de DEB\_LIGNE jusqu’au premier VirtualHost trouvé

sed -i "$DEB\_LIGNE,/\</VirtualHost\>/"d $FICHIER[/code]

Tu avais remplace le $1 du awk par $USER, le $1 du awk n’a rien avoir avec l’argument passé au script. Il dit de n’afficher que la premiere valeur avant le “:”.

Dans le sed, tu avais mis des cote simple au lieu des cote double. Si tu met des cote simple le $DEB\_LIGNE ne renvoie pas ca valeur et tu avais oublie la virgule entre les deux valeurs qui signifie de $DEB\_LIGNE à sinon ca signifie de remplacer $DEB\_LIGNE par .

J’espere avoir ete clair dans les explications.

@+

---

<div class="post-metadata">

**Author:** ![dexmon](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/d/d2c977/32.png) [@dexmon](https://www.debian-fr.org/u/dexmon)\
**Post date:** [Février 20, 2016, 4:37 UTC](https://www.debian-fr.org/t/resolu-shell-suppression-de-lignes-dans-un-fichier/10168/9 "2016-02-20T16:37:44Z")

</div>

[quote=“micky979”]Bonjour,

Voici la correction :

[code]#!/bin/bash

echo -n "Quel vhosts voulez-vous supprimer ? : "  
read USER

# Chemin vers le fichier

FICHIER="/root/vhosts.conf"

VHOST\_ASUPP=$[USER.domain.com](http://USER.domain.com)

# Recherche de la ligne contenant le domaine et soustraction de 1

DEB\_LIGNE=$((`grep -n $VHOST_ASUPP $FICHIER | awk -F":" '{print $1}'`-1))

# Suppression des lignes de DEB\_LIGNE jusqu’au premier VirtualHost trouvé

sed -i "$DEB\_LIGNE,/\</VirtualHost\>/"d $FICHIER  
exit 0[/code]

Tu avais remplace le $1 du awk par $USER, le $1 du awk n’a rien avoir avec l’argument passé au script. Il dit de n’afficher que la premiere valeur avant le “:”.

Dans le sed, tu avais mis des cote simple au lieu des cote double. Si tu met des cote simple le $DEB\_LIGNE ne renvoie pas ca valeur et tu avais oublie la virgule entre les deux valeurs qui signifie de $DEB\_LIGNE à sinon ca signifie de remplacer $DEB\_LIGNE par .

J’espere avoir ete clair dans les explications.

@+[/quote]

Mercii ça marche 🙂
