IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Commande de suppression de texte


Sujet :

Shell et commandes GNU

  1. #1
    Invité
    Invité(e)
    Par défaut Commande de suppression de texte
    Bonjour,

    J'aimerai créer une commande qui va supprimer un bout de texte (script js) dans tous les fichiers qui contiennent ce bout de texte. D'après ce que je constate, c'est ne sont essentiellement que des fichiers js .

    J'ai fait ressortir le nombre de fichier contenu ce bout de code à supprimer, et il y en a 25 000 fichiers.

    Existe-il un script pour passer à la moulinette tous les fichiers du serveur qui contiennent le bout de script à supprimer ?

    Merci vraiment pour votre aide

    A+

  2. #2
    Expert confirmé Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Par défaut
    oui tu peux utiliser sed dans une boucle sur la liste des fichier pour les traiter.

    truc de base "qui permet de comprendre" à adapter à ton besoin
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for i in *js ; do mv ${i} ${i}.old && sed 's/eee/aaa/' ${i}.old > ${i} && rm ${i}.old ; done
    en clair

    pour tout fichier *.js faire ( renomer en .old et si ok modifier eee par aaa et si ok effacer le .old )

    méthode qui permet donc le retour arrière et surtout de ne pas écraser le fichier d'origine si l'étape de substitution du texte échoue pour une raison quelconque.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Vraiment merci pour ta réponse super rapide !

    Par contre le texte de recherche ici dans ton exemple 'eee' va contenir une longue chaîne de caractères de script js qui comporte malheureusement des caractères spéciaux de code dont le '\' ou '/'

    exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed 's/http://www.domaine.tld" {$mavar} >//'
    ou eee = s/http://www.domaine.tld" {$mavar} >
    et aaa = rien du tout car c'est une suppression de texte mon souhait

    Qu'en penses-tu ?

    Faut-il passer par un fichier texte annexe qui contiendrait toute la chaine 'eee', et l'appeler dans le script à la manière d'une variable ?

    Vraiment merci pour ton aide

  4. #4
    Invité
    Invité(e)
    Par défaut
    Je viens d'avancé sur ton idée, en modifiant les directives de sed pour supprimer la ligne commençant par ce que je souhaite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for i in /home/moi/*js ; do mv ${i} ${i}.old && sed -e "/^début de mon texte de la ligne à supprimer/d" ${i}.old > ${i} && rm ${i}.old ; done
    ça semble fonctionner mais j'ai encore des problèmes pour le boucler récursivement dans les sous-dossier

  5. #5
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 713
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 713
    Par défaut
    Bonjour,

    soit tu es sous bash >=4, et tu peux positionner l'option globstar avec shopt, et tu boulce sur ~/**/*js,
    ou alors tu utilises find -exec avec sh :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find ~/ -type f -name "*.js" -exec sh -c 'for i do mv ${i} ${i}.old && sed -e "/^début de mon texte de la ligne à supprimer/d" ${i}.old > ${i} && rm ${i}.old ; done' {} \+
    non, je n'ai rien oublié : in "$@" est facultatif.

  6. #6
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    Salut,

    Citation Envoyé par N_BaH Voir le message
    soit tu es sous bash >=4, et tu peux positionner l'option globstar avec shopt, et tu boulce sur ~/**/*js,
    À ce moment là on peut même s'éviter une boucle, sed avec l'options "-i" (ou "-i.bak" pour faire une sauvegarde, celle-là étant facultative), devrait faire l'affaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -i '/^début de mon texte de la ligne à supprimer/d' ~/**/*.js

  7. #7
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 103
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    Bonjour,

    soit tu es sous bash >=4, et tu peux positionner l'option globstar avec shopt, et tu boulce sur ~/**/*js,
    ou alors tu utilises find -exec avec sh :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find ~/ -type f -name "*.js" -exec sh -c 'for i do mv ${i} ${i}.old && sed -e "/^début de mon texte de la ligne à supprimer/d" ${i}.old > ${i} && rm ${i}.old ; done' {} \+
    non, je n'ai rien oublié : in "$@" est facultatif.
    Pour ma culture personnelle, ne peut-on pas faire un exec simple? Du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    find ~/ -type f -name "*.js" -exec \
    sed -i -e "/^début de mon texte de la ligne à supprimer/d" {} \;
    @zipe31: grillé

  8. #8
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 713
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 713
    Par défaut
    ça pourrait même être plus rapide avec \+,
    ça aurait le même effet que ~/**/*js, c'est à dire que tous les fichiers trouvés seraient passés d'un coup à sed.

  9. #9
    Invité
    Invité(e)
    Par défaut
    Vraiment merci pour votre participation et vos conseils !

    Voilà en fait mon script final que j'ai fait tourné sans problème sur mon serveur : (exécuté en root obligé, pour les modifications + chown)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #!/bin/bash
     
    cat /root/fichier_liste_js.txt | while read i; #parcours toutes les lignes du fichier
    do 
    	echo "Traitement de ${i}" #chaque ligne "i" passe en traitement
    	mv "${i}" "${i}".old && sed -e "/^mon début de texte de la ligne à supprimer/d" ${i}.old > ${i} && rm ${i}.old ;  #édition du fichier définie dans "i" et effacement de la ligne commençant par "mon début de texte de la ligne à supprimer" si elle existe dans le fichier définie dans "i"
    	user=$( echo "${i}" | cut -d '/' -f 3 ) #le chemin du fichier "i" contient obligatoire le nom du user, on place le user dans la variable "user"
    	chown ${user}:users "${i}" # on redonne les droits d'origines au user respectif pour le fichier "i"
    done
    Ce script s'accompagne du fichier texte contenant la liste des répertoires/fichiers du /home qui est le résultat du requête find :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    find /home -name "*" -exec grep -Hn "mon début de texte de la ligne à supprimer" {} \; > /root/fichier_liste_js.txt
    Après une petite transformation du fichier fichier_liste_js.txt en édition csv, pour ne récupérer que la colonne qui liste les répertoires, voici un exemple de contenu du fichier traité par le script de remplacement :
    ...
    /home/moi/rep1/rep2/file1.js
    /home/moi/rep1/rep3/file2.js
    /home/moi/rep78/rep3/file3.js
    /home/moi/rep1/file4.js
    /home/lui/rep5/rep2/file1.js
    /home/lui/rep12/rep3/file3522435.js
    /home/elle/rep324/rep5325/file3525.js
    /home/elle/rep12313412/file647476.js
    ...
    En gros, même si je pense que vous avez les compétences de tout faire en 1 seule commande j'ai préféré faire ça en 2 temps pour mieux en contrôler les tests intermédiaires, car ça reste une action sur un serveur en prod.

    Mais le principal est que je sois parvenu à mes fins, pour le traitement automatique de plus de 25 000 fichiers.
    Et ceci en partie grâce à vous ! Z'êtes sympa

    Pour info, le script a tourné environ 5 min pour traiter les 25 000 fichiers.

    A+

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Insérer des commandes Latex dans le texte
    Par Noodles dans le forum Mise en forme
    Réponses: 3
    Dernier message: 21/03/2007, 12h57
  2. Script pour créer une commande de suppression de fichiers
    Par romain.1105 dans le forum Shell et commandes GNU
    Réponses: 13
    Dernier message: 10/12/2006, 03h28
  3. Commande pour encadrer du texte
    Par Paenitentia dans le forum Mise en forme
    Réponses: 5
    Dernier message: 07/12/2006, 19h46
  4. Commande pour souligner du texte
    Par flower1987 dans le forum Mise en forme
    Réponses: 2
    Dernier message: 30/11/2006, 12h30
  5. [FLASH MX2004] Ajout et suppression de texte
    Par noarno dans le forum Flash
    Réponses: 2
    Dernier message: 17/06/2005, 14h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo