Forum Linux.débutant Vim - Affichage des répertoires sur d'une liste

Posté par  . Licence CC By‑SA.
Étiquettes :
0
6
oct.
2024

Bonjour à tous :)

Je suis nouveau sur le forum et fais mes premiers pas sur Debian 12.
Enfin, pas vraiment, mais pas de cette manière, le shell c'est tout nouveau pour moi.
Je comprends plus ou moins la logique (je pense), après ça viendra avec l'habitude.

Je suis actuellement en formation comme administrateur IT et j'ai de l'utilisation de Linux pendant mes cours, logique pour l'administration serveur :)

J'ai quelques exercices sur l'utilisation de VIM. Je n'ai pas trop de soucis avec les déplacements et les commandes de base.

D'habitude, je m'en sors assez bien avec mon cours et parfois chatgpt.
Mais là je sèche et les différentes propositions de ChatGpt ne fonctionnent pas, ou alors je m'y prends mal.

Voici mon problème : j'aurais besoin, après la création d'une liste des fichiers, avec Vim, supprimer uniquement les lignes équivalentes aux répertoires.

Créa. Liste : (commande imposée par le prof)
Ls -l /etc > liste.txt
vi liste.txt

Ensuite je sèche.

Je suis presque sur, que ça doit être simple et que je cherche compliqué…

Merci ;)

  • # Il suffit d'analyser la liste

    Posté par  . Évalué à 3 (+1/-0). Dernière modification le 06 octobre 2024 à 11:42.

    En mode édition, Vi(m) permet de faire de la modification massive de fichiers sur tout ou partie de celui-ci.

    Par exemple pour faire de la substitution de texte, il est possible d'utiliser "s". Pour remplacer la première occurence de "toto" par "titi" dans un fichier, il suffit de taper la séquence suivante en mode commande :

    
    :s/toto/titi/
    
    

    s pour substitute, ensuite on fait comme avec sed, on positionne entre /// la regexp source puis la chaine cible. Il est d'usage d'utiliser le / comme caractère de séparation, mais on peut aussi en utiliser d'autres (tels que !, :, … et l'expression devient alors :s!toto!titi!), ce qui est pratique lorsque la regexp contient des '/' A noter que cette commande ne se fera que sur la ligne courante.

    Pour faire la modification sur plusieurs lignes, il suffit de spécifier les lignes sur lesquelles on veut faire la modif

    
    :2s/toto/titi/
    
    

    Cette commande va remplacer la première expression 'toto' par 'titi' en ligne 2. Pour le faire sur plusieurs lignes :

    
    :1,3s/toto/titi/
    
    

    Cette commande va remplacer la première expression 'toto' par 'titi' sur les lignes 1 à 3. Pour le faire sur la totalité du fichier :

    
    :1,$s/toto/titi/
    
    

    Le remplacement se fera de la ligne 1 à la dernière ligne, symbolisée par le caractère '$'

    Autre point : pour remplacer la totalité des occurences de l'expression régulière sur une ligne plutôt que la première, il suffit d'ajouter un 'g' à la fin de la commande :

    
    :1,$s/toto/titi/g
    
    

    Ici on remplacera, dans tous le fichier (1,$) l'expression 'toto' par 'titi' sur toutes les lignes. Il existe d'autres flags que 'g' (utilisés également avec sed et awk) que je ne détillerai pas ici pour éviter d'embrouiller, mais vous pouvez aller voir cette documentation. Ce sont plus ou moins les mêmes que pour sed.

    Nous avons vu comment remplacer du texte dans ceraines lignes via des regexp. Maintenant commant les supprimer ?

    Il suffit d'utiliser 'g' comme ceci pour supprimer par exemple toutes les lignes contenant l'expression toto dans le fichier :

    
    :g/toto/
    
    

    Ici, pas besoin de spécifier les lignes sur lesquelles la commande s'exécutera, elle se fera sur l'ensemble du fichier. Toutes les lignes contenant 'toto' seront supprimées.

    Du coup pour répondre à ta question, il te suffit d'identifier dans ton fichier une expression qui te permet de distinguer un répertoire d'un fichier, et d'utiliser la commande que je t'ai donnée au dessus. Je te laisse chercher un peu la regexp à utiliser ….

    • [^] # Re: Il suffit d'analyser la liste

      Posté par  . Évalué à 2 (+0/-0). Dernière modification le 06 octobre 2024 à 11:49.

      Oups … j'ai oublié une étape (le commentaire sous le mien me l'a rappelé, merci à kangourou13000 ) : pour la suppression des lignes il fait ajouter 'd' à la fin ce qui donne pour mon exemple :

      
      :g/toto/d
      
      
      
      • [^] # Re: Il suffit d'analyser la liste

        Posté par  . Évalué à 2 (+0/-0).

        En fait pour être plus précis, g signifie "global". Si on ne spécifie pas "g dans l'expression ( :/toto/d ) , la commande s'exécutera sur la ligne courante : la ligne courante sera supprimée si elle contient l'expression 'toto', et vim demande d'appuyer sur "n" pour trouver le suivant.

    • [^] # Re: Il suffit d'analyser la liste

      Posté par  . Évalué à 1 (+0/-0).

      Bonjour, je te remercie pour ta réponse ;)

      Eh bien, me voilà parti à la recherche d'une expression.

      C'est quelque chose que je n'ai pas encore vu en cours… il va me falloir un peu de temps pour.
      Mais je suis persévérant :)

      Je reviens poster la solution dès que je l'ai ;)

      • [^] # Re: Il suffit d'analyser la liste

        Posté par  . Évalué à 2 (+0/-0).

        Petit coup de pouce pour la trouver : qu'est-ce qui différencie un répertoire d'un fichier dans ta liste ?

        • [^] # Re: Il suffit d'analyser la liste

          Posté par  . Évalué à 1 (+0/-0).

          dans les droit, tous les rép commence "d"

          Merci tu viens d'éclairer mon empoule :)

          Je reste encore avec visualisation de ce fichier texte comme une commande "ls -l" classic, alors que ce fichier n'est que du texte. Donc utiliser "d" avec une des tes commandes.., je penses être sur a bonne piste?

          • [^] # Re: Il suffit d'analyser la liste

            Posté par  . Évalué à 2 (+0/-0).

            Oui c'est exactement ça. Il te suffit de trouver la regexp qui permet d'identifier toutes les lignes qui commencent par 'd' et de les supprimer comme je te l'ai indiqué dans les précédents posts.

        • [^] # Re: Il suffit d'analyser la liste

          Posté par  . Évalué à 2 (+1/-0).

          Super merci de ton aide :)

          voici ma démarche:

          :1,$s/drwx/REP/

          :g/REP/d

          • [^] # Re: Il suffit d'analyser la liste

            Posté par  . Évalué à 2 (+0/-0).

            Ca ne marchera pas dans tous les cas. Si une ligne commence par "dr--" (lecture uniquement pour le propriétaire), tu ne le trouveras pas. D'autre part, si tu as un fichier qui contient "drwx" dans son nom, il sera supprimé également.

            Il y a moyen de le faire en une seule fois :
            ```

            :g//d

            
            Il te suffit de trouver la regex adéquate.
            
            • [^] # Re: Il suffit d'analyser la liste

              Posté par  . Évalué à 2 (+0/-0). Dernière modification le 06 octobre 2024 à 13:02.

              La clé c'est c'est "ligne qui commence par"

            • [^] # Re: Il suffit d'analyser la liste

              Posté par  . Évalué à 1 (+0/-0).

              Oui j'ai remarqué ça, quand j'ai essayé avec "d", toutes lignes avec un "d" étaient impactées.

              Dans mon cas, ce que j'ai fait fonctionne, mais comme tu dis, ça ne fonctionnera pas à chaque fois, c'est au cas par cas.

  • # cool des regex XD

    Posté par  . Évalué à 2 (+1/-0). Dernière modification le 06 octobre 2024 à 11:46.

    Edit: zut j'ecrit doucement, une reponse infiniment plus complete a ete donné entre temps… je supprime la mienne qui est pas terrible :)

    • [^] # Re: cool des regex XD

      Posté par  . Évalué à 2 (+0/-0).

      Non, ta réponse a été utile : j'avais oublié un détail à la fin, et lire ton commentaire me l'a rappelé ..

    • [^] # Re: cool des regex XD

      Posté par  . Évalué à 1 (+0/-0).

      Bonjour,

      Même si tu as manqué de rapidité, je te remercie quand même ;)

Envoyer un commentaire

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.