Sed ajout d'un caractère en fin de ligne

Résolu
vieurou Messages postés 73 Statut Membre -  
Lordanonymous Messages postés 229 Statut Membre -
bonjour,

Je voudrais avec sed pouvoir ajouter un caractère en fin de ligne, mais uniquement si cette ligne ne commence pas par un #, ni par espace #, ni par tabulation #.

Sur les lignes traitées, je voudrais rajouter un caractère en fin de ligne, mais si cette ligne contient un #, je voudrais que ce caractère soit placé non plus en fin de ligne mais avant le dièse.

Par exemple , je voudrais que le fichier contenant le texte :


#code commenté
#code commenté
code non commenté
code non commenté #commentaire

devienne :


#code commenté
#code commenté
code non commenté(un caractère en plus ici)
code non commenté(un caractère en plus ici) #commentaire


merci de votre aide

9 réponses

Résumé de la discussion

La problématique liée à sed consiste à ajouter un caractère en fin de ligne uniquement sur les segments qui ne commencent ni par un dièse, ni par un espace, ni par une tabulation. Pour les lignes contenant un dièse, le caractère doit être inséré avant le dièse plutôt qu'en fin de ligne, avec des exemples montrant le texte et le résultat attendu. Plusieurs propositions utilisent des expressions régulières et des dérivations sed, avec des motifs excluant les lignes non pertinentes et des substitutions en fin de ligne, notamment s/.*/&A/ ou s/[ ]*#/A&/. En outre, des aspects pratiques liés au format de fichier (DOS/Unix) et à l'usage de caractères spéciaux comme \t influent sur le comportement des commandes et nécessitent des ajustements.

Généré automatiquement par IA
sur la base des meilleures réponses
  1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    -e
    Permet d'enchainer plusieurs commandes

    /^[ ]*#\|#\|^$/!
    Recherche toutes les lignes ne commençants pas "^" par un dièse, précédé ou non d'un espace "[ ]*", ou "\|" (on protège le "pipe" par un antislash pour qu'il ne soit pas interprété littéralement) contenant un dièse, ou "\|^$" les lignes vides. Le point d'exclamation final permettant d'exprimer la négation

    s/.*/&A/'
    On substitue alors toute la ligne ".*" par elle même "&" suivie d'un "A"

    -e '/^[ ]*#/!
    Nouvelle commande, toutes lignes ne commençant pas par un dièse, précédé ou non d'un espace

    s/[ ]*#/A&/'
    Substituer le motif constituer d'un ou plusieurs espace(s) suivi(s) d'un dièse par un A et le motif lui même (&)

    ;-))
    10
    1. Lordanonymous Messages postés 229 Statut Membre 143
       
      Merci, juste ce qu'il me fallait.
      0
  2. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Re-
    sed -e '/^[ ]*#\|#\|^$/! s/.*/&A/' -e '/^[ ]*#/! s/[  ]*#/A&/' fichier
    ;-))
    2
  3. vieurou Messages postés 73 Statut Membre 2
     
    encore merci

    serait'il possible que tu me décortique cette commande que je puisse la comprendre stp
    1
  4. vieurou Messages postés 73 Statut Membre 2
     
    je sais pas trop pourquoi mais sed -e '/^[ ]*#\|#\|^$/! s/.*/&;/' me fait un retour a la ligne avant de me mettre mon point virgule, ça doit etre parceque mon fichier et un fichier dos mais coment resoudre cela?
    1
    1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      Oui c'est effectivement la cause, je viens de tester.

      La solution est dans la conversion au format Unix, soit avec un utilitaire comme "dos2unix" soit avec la méthode donnée plus haut avec "sed".
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. vieurou Messages postés 73 Statut Membre 2
     
    et dans s/[ ]*#/;&/' si je veut aussi qu'il me suprime les tabulation j'atoute \t\+ comme cela?
    s/[ ]*\t\+#/;&/' 


    apres test, ça marche pas
    0
  7. vieurou Messages postés 73 Statut Membre 2
     
    eh bien le souci c'est que la premiere commande de mon script est
    sed -i -e 's/^M$//' $file
    qui normalement me le met en format unix, nan?
    0
  8. vieurou Messages postés 73 Statut Membre 2
     
    s/[ ]*\t*#/;\t\t&/ fonctionne
    0
    1. abou
       
      Et si on veut juste commenter par un # une ligne contenant une chaîne donnée ?

      Merci d'avance.
      0
    2. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898 > abou
       
      Salut,
      jp@MDK:~/tmpfs ssh$ cat fichier
      Bonjour,
      
      Et si on veut juste commenter par un # une ligne contenant une chaîne donnée ?
      
      Merci d'avance.
      
      jp@MDK:~/tmpfs ssh$ sed '/commenter/ s/.*/#&/' fichier
      Bonjour,
      
      #Et si on veut juste commenter par un # une ligne contenant une chaîne donnée ?
      
      Merci d'avance.
      
      jp@MDK:~/tmpfs ssh$
      ;-))
      0
    3. abou > jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention  
       
      OK ça marche pour une chaîne constante. Qu'en est-il des chaînes variables ? Merci
      0
    4. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898 > abou
       
      Qu'entends-tu par variable ???

      Des exemples ?
      0
    5. abou > jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention  
       
      OK ça marche pour une chaîne constante. Qu'en est-il des chaînes variables ? Merci

      J'ai trouvé : il suffit d'utiliser les doubles quotes !

      sed "/$ch/ s/.*/#&/" test.txt
      au lieu de
      sed '/$ch/ s/.*/#&/' test.txt
      0
  9. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Je comprends pas; chez moi ça marche bien :
    [tmpfs]$ cat test.txt
    un
    deux
    trois
    cent-deux
    vingt-deux
    cinq
    six deux
    
    [tmpfs]$ ch=deux
    
    [tmpfs]$ echo "$ch"
    deux
    
    [tmpfs]$ sed "/$ch/ s/.*/#&/" test.txt
    un
    #deux
    trois
    #cent-deux
    #vingt-deux
    cinq
    #six deux
    
    [tmpfs]$ sed '/'"$ch"'/ s/.*/#&/' test.txt
    un
    #deux
    trois
    #cent-deux
    #vingt-deux
    cinq
    #six deux
    
    [tmpfs]$
    ;-\
    0
    1. abou
       
      Oui la command sed tout court fonctionne bien en sortie standard. Mon souci c'est de faire l'insertion avec sed -i sans redirection si possible.
      0
    2. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898 > abou
       
      Ça marche pareil :
      [tmpfs]$ cat test.txt
      un
      deux
      trois
      cent-deux
      vingt-deux
      cinq
      six deux
      
      [tmpfs]$ sed -i.bak '/'"$ch"'/ s/.*/#&/' test.txt
      
      [tmpfs]$ cat test.txt
      un
      #deux
      trois
      #cent-deux
      #vingt-deux
      cinq
      #six deux
      
      [tmpfs]$
      ;-\
      0
    3. abou
       
      Tu m'apprends des choses : tout était dans le .bak !
      0
    4. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898 > abou
       
      Ben en fait ça crée une sauvegarde. Tu mets ce que tu veux après le "i"...

      Et tant qu'on y est, il y a plus simple pour rajouter un # en début de ligne :
      sed '/deux/ s/^/#/' test.txt
      ;-))
      0
    5. abou > jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention  
       
      Fantastique sauf qu'avec une variable il me faut absolument les doubles quotes.
      Et pour le fun : à quoi bon commenter une ligne qui l'est déjà ?
      Ce qui donnerait avec des regex (un début, une négation)… je suis fatigué et toi ?
      0
  10. abou
     
    Je ne peux faire un sed --version ;-)
    Ça doit être du BSD vu que je suis sous Leopard (Mac OS X).
    0