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
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 totof2000 . Évalué à 4 (+2/-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 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
Cette commande va remplacer la première expression 'toto' par 'titi' en ligne 2. Pour le faire sur plusieurs lignes :
Cette commande va remplacer la première expression 'toto' par 'titi' sur les lignes 1 à 3. Pour le faire sur la totalité du fichier :
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 :
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 :
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 totof2000 . Évalué à 3 (+1/-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 :
[^] # Re: Il suffit d'analyser la liste
Posté par totof2000 . Évalué à 3 (+1/-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 davidvh . Évalué à 2 (+1/-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 totof2000 . Évalué à 4 (+2/-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 davidvh . Évalué à 2 (+1/-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 totof2000 . Évalué à 4 (+2/-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 davidvh . Évalué à 3 (+2/-0).
Super merci de ton aide :)
voici ma démarche:
[^] # Re: Il suffit d'analyser la liste
Posté par totof2000 . Évalué à 4 (+2/-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
[^] # Re: Il suffit d'analyser la liste
Posté par totof2000 . É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 davidvh . Évalué à 1 (+0/-0). Dernière modification le 06 octobre 2024 à 13:26.
donc ici ça serait
:1,$s/^d/REP/ || g/^REP/d
Je viens de faire test et ça à l'ai bon :)
[^] # Re: Il suffit d'analyser la liste
Posté par totof2000 . Évalué à 4 (+2/-0). Dernière modification le 06 octobre 2024 à 13:28.
Normalement, en une seule fois ça passe (pas besoin d'intermédiaire):
Il n'est pas utile de remplacer quoi que ce soit pour que ça marche. Mon explication sur le remplacement était là pour faire comprendre le mode de fonctionnement de VIM, et ce qu'il permet de faire en général. Ca permet de comprendre la logique (et peut servir plus tard).
Vérifie quand même …
[^] # Re: Il suffit d'analyser la liste
Posté par davidvh . Évalué à 3 (+2/-0). Dernière modification le 06 octobre 2024 à 13:31.
Ok. en une fois ça marche ;)
Par contre j'ai du mal à insérer du code sur le forum, malgré que je sélectionne l'icône "code block"! j'ai essayé avec "quote" mais pareil..
[^] # Re: Il suffit d'analyser la liste
Posté par totof2000 . Évalué à 3 (+1/-0).
Je me suis fait aussi avoir … pour insérer des blocs de code il faut une ligne vide avant le délimiteur de début de bloc de code (les 3 quotes inversées).
[^] # Re: Il suffit d'analyser la liste
Posté par davidvh . Évalué à 1 (+0/-0).
test insertion code:
(A l'édition j'ai 2 lignes vide entre ma dernière phrase et le block code, 1 ça ne marche pas!)
Merci ;)
[^] # Re: Il suffit d'analyser la liste
Posté par davidvh . É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 kangourou13000 . É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 totof2000 . Évalué à 3 (+1/-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 kangourou13000 . Évalué à 1 (+0/-0).
Mince je laisserais la prochaine fois… j'ai été complexé par ta reponse de qualité haha, qui poussais mieux a la comprehension XD mais merci!
[^] # Re: cool des regex XD
Posté par davidvh . É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.