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

Linux Discussion :

[Shell] VI ajout de texte en masse.


Sujet :

Linux

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 11
    Par défaut [Shell] VI ajout de texte en masse.
    Bonjour à toutes et à tous.

    J'ai un petit souci sous "vi", je doit faire passer un bout de script.
    Et je n'arrive pas à modifier les lignes en masse.

    Un truc du style [11,19]I/# pour mettre en commentaire les ligne 11 à 19.
    Je ne trouve pas d'information sur le net et je ne trouve pas mon bonheur dans les aides mémoires "vi". J'essai des combinaison mais je doit certainement faire des erreurs de syntax.

    Si une ame charitable pouvait m'aider.

    Merci à vous.

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 11
    Par défaut Pareil : Faire un map et l'appliquer à toutes les lignes. Je m'arrache les cheveux !
    Je cherche à effectuer automatiquement une action simple sur toutes les lignes d'un fichier à l'aide d'un script vim.
    J'ai fait un map :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    :map t $8h8x16hi0       <ESC>0j
    Afin de :
    Aller à la fin de la ligne ($)
    Reculer à gauche de 8 caractères (8h)
    Supprimer 8 caractères (8x)
    Reculer à gauche de 16 caractères (16h)
    Passer en mode insertion (i)
    insérer la séquence "0 "
    Sortir du mode insertion (<ESC>)
    Revenir en début de ligne (0)
    Passer à la ligne suivante (j)

    Lorsque je me mets au début et que je reste appuyé sur t ça fonctionne.
    Mais c'est un peu long !

    Le problème est qu'aucune des commandes suivantes ne fonctionne :
    Je dois en plus pouvoir appeler ce script par un cron ensuite... Mais pour cette partie, je pense qu'un vi -s script.vim nom_du_fichier devrait faire l'affaire.

    Si quelqu'un a une solution, je lui en serai éternellement reconnaissant !

  3. #3
    Membre émérite Avatar de BlaireauOne
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    492
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2007
    Messages : 492
    Par défaut
    Tanat, sed est adapté à tes besoins
    http://www.shellunix.com/sed.html

    Si j'ai bien compris :
    1._ supprimer les 8 derniers caractères de chaque ligne
    2._ insérer une chaîne de caractères avant les 16 derniers caractères de chaque ligne.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -i -e 's/.\{8\}$//'  -e 's/\(.\{16\}\)$/0       \1/' nom_du_fichier
    Fichier d'origine :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    aaaaaaaaaaaaaaaa88888888
    aaaaaaaaaaaaaaaa88888888
    123456789012345688888888
    123456789012345688888888
    Résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    0       aaaaaaaaaaaaaaaa
    0       aaaaaaaaaaaaaaaa
    0       1234567890123456
    0       1234567890123456

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 11
    Par défaut
    Citation Envoyé par BlaireauOne Voir le message
    Tanat, sed est adapté à tes besoins
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -i -e 's/.\{8\}$//'  -e 's/\(.\{16\}\)$/0       \1/' nom_du_fichier
    Merci beaucoup pour cet exemple de sed qui fait presque exactement ce que je veux !
    En fait les 8 derniers caractères à supprimer sont à gauche du dernier caractère de la ligne : Il faut garder ce dernier. (Petite subtilité dans le code vi ci-dessus.)

    J'aurais bien aimé résoudre le problème dans vi, mais puisque tu m'as fourni un très bon exemple avec sed, je vais donc l'utiliser pour mon script.

    D'autant plus que ça me fera un job cron tout simple du coup !

    J'essaie de faire la petite modif du code sed et je vous recontacte.

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 11
    Par défaut Toujours pas réussi... J'ai essayé avec awk...
    Je n'ai pas réussi à modifier la ligne de commande sed pour supprimer les 8 derniers caractères à gauche du dernier de la ligne.

    J'ai donc tenté avec awk en mode colonnes à largeur fixe. Voici plusieurs tentatives :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #!/bin/bash
    # awk -v FIELDWIDTHS="179 8 8 8 1" '{printf $0 "0       " $2 $3 $5 "\n"}' test
    # awk '{FIELDWIDTHS="79 80 8 8 1"; $0=$0; printf $0 "_" $1 "\n"}' test
    # awk 'BEGIN { FIELDWIDTHS = "178 8 8 8 1" }{print $2 "_" $1 "_" $3}' test
    awk -v FIELDWIDTHS="178 8 8 8 1" 'BEGIN {print $2 "_" $1 "_" $3}' test
    (Les sorties ne sont pas toujours celles du but final recherché, mais des essais.)

    Le problème est que awk ne semble pas utiliser la variable FIELDWIDTHS et continue à considérer que le séparateur de colonnes est un espace.

    Quelqu'un aurait-il une idée géniale ?

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 859
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 859
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par TanaT Voir le message
    Merci beaucoup pour cet exemple de sed qui fait presque exactement ce que je veux !
    En fait les 8 derniers caractères à supprimer sont à gauche du dernier caractère de la ligne : Il faut garder ce dernier. (Petite subtilité dans le code vi ci-dessus.)
    Je tape ça de tête car j'ai pas de Linux sous la main pour tester mais ça devrait le faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -e "s/........\(.\)$/\1/" fichier > fichier2
    En fait, je remplace les 9 derniers caractères dont le dernier a été mémorisé (les parenthèses) en mémoire 1 par le contenu de la mémoire 1 (le dernier caractère). Tu complètes avec le code de BlaireauOne pour la modif sur les 16 autres caractères et t'as tout.

    Comme quoi, quand on connait bien vi (n'est-ce pas Ashin ?)
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  7. #7
    Membre émérite Avatar de BlaireauOne
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    492
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2007
    Messages : 492
    Par défaut
    Normalement, avec le lien ci-dessous, tu dois pouvoir comprendre le fonctionnement de la commande
    http://www.shellunix.com/sed.html

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -i -e 's/.\{8\}\(.\)$/\1/' -e 's/\(.\{16\}\)$/0       \1/' nom_du_fichier

  8. #8
    Membre émérite Avatar de BlaireauOne
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    492
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2007
    Messages : 492
    Par défaut
    je n'arrive pas à modifier les lignes en masse

    A ma connaissance, l'équivalent de vi en batch, s'appelle sed


    Ce qui suit fait l'affaire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed '11,19s/^/#/' TonFichier > $$tmp && mv $$tmp TonFichier

  9. #9
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    271
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 271
    Par défaut
    Comme pour sed, dans vim :
    On substitue le début des lignes 1 à 4 par un # .

  10. #10
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 297
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 297
    Par défaut
    vi étant quasi éteint, je suppose que tu as vim.
    Si ces modifs tu dois les faire tandis quand tu édites tes fichiers, pense à installer des plugins comme EnhancedCommentify ou NERDCommenter.
    Si c'est pour scripter plein de remplacements, un petit coup de GNU-sed et c'est vite joué si tu es capable de formuler les lignes de début et de fin (par numéro ou regex).
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

Discussions similaires

  1. Ajouter du texte dans une edit box
    Par raf_gug dans le forum MFC
    Réponses: 10
    Dernier message: 23/05/2013, 10h00
  2. Ajouter du texte dans un input à partir d'une autre fenêtre
    Par Michaël dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 13/04/2005, 20h14
  3. [jTextPane] Ajouter du texte à la suite...
    Par doudine dans le forum Composants
    Réponses: 2
    Dernier message: 03/01/2005, 13h38
  4. Ajout de texte dans un fichier
    Par willowII dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 24/08/2004, 19h30
  5. [TWebBrowser] Comment ajouter du texte ?
    Par el_diablos dans le forum Composants VCL
    Réponses: 18
    Dernier message: 06/07/2004, 09h17

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