[UNIX] Substitution caractère dans un fichier

looping605 Messages postés 9 Statut Membre -  
 Maryline -
Bonjour,
J'aurais voulu savoir si quelqu'un connaissait des commandes unix permettant de substituer un caractére par un autre dans un fichier, dont on spécifit la position dans le fichier concerné ( n° ligne et n° colonne ).
J'ai essayé de la manière suivante :

vi toto.txt << EOT
:3
69l
rS
:x!
EOT
exit 0

Mais le soucis est que cela ne fonctionne que si le fichier est editable sous vi.
Il arrive que pour certains "gros" fichiers j'ai le problème suivant :
"titi.txt" Line too long

Merci d'avance de vos réponses

8 réponses

  1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Re-
    [jp@MDK tmpfs] $ cat toto.txt
    
    123123123
    456456456
    789789789
    123123123
    456456456
    789789789
    
    [jp@MDK tmpfs] $ sed -i.bak '3s/\(.\{3\}\)\(.\{1\}\)\(.*\)/\1A\3/' toto.txt
    
    [jp@MDK tmpfs] $ cat toto.txt
    
    123123123
    456456456
    789A89789
    123123123
    456456456
    789789789
    
    ;-))
    1
    1. looping605 Messages postés 9 Statut Membre
       
      Merci beaucoup c'est trop cool.
      Je vais voir ce que cela donne sur un dès fichiers que je ne pouvait modifier par ma première procédure.

      mais ça va beaucoup m'aider.

      Encore merci à tous.
      0
    2. looping605 Messages postés 9 Statut Membre
       
      Bon ça marche bien avec des petits fichiers mais avec des fichiers contennat beaucoup d'enregistrements la commande sed ne suit plus.

      Mais je garde sous le coude ça peut toujours être utile.

      Merci encore de ton aide
      @+
      0
  2. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Salut,

    Tu peux donner un exemple plus précis (fichier en entrée et résultat escompté en sortie), s'il te plaît, merci.

    Sinon tu peux déjà voir du côté de la commande "sed" (associée surement à d'autres pour ce que je pense avoir compris de ce que tu veux faire)

    ;-))
    0
  3. looping605 Messages postés 9 Statut Membre
     
    Re-bonjour,

    Je vais essayer d'être plus précis.

    je veux pouvoir modifier un caractére dans un fichier via un script.
    Par exemple j'ai un fichier toto.txt
    dans ce fichier, j'ai les enregistrements suivants :
    123123123
    456456456
    789789789
    je souhaite substituer le caractére "7" de la 3eme ligne de la 4 éme colonne en un caractére "A" afin d'obtenir :
    123123123
    456456456
    789A89789

    Cela fonctionne si j'utilise le script toto.ksh suivant :
    Serveur_Test>more toto.ksh

    #!/usr/bin/ksh
    vi toto.txt << EOT
    :2
    4l
    rA
    :x!
    EOT
    exit 0

    Le problème se pose lorsque le fichier toto.txt, qui doit être éditer contient beaucoup trop d'enregistrement pour être edité avec "vi".
    Dans ce cas, la proc. ne fonctionne pas.

    J'ai essayé avec la commande "sed" mais je n'ai pas trouvé l'option permettant de passer en paramétre un n° de colonne.

    Merci
    0
  4. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    123123123
    456456456
    789789789
    je souhaite substituer le caractére "7" de la 3eme ligne de la 4 éme colonne en un caractére "A" afin d'obtenir :
    123123123
    456456456
    789A89789


    je n'ai pas testé, mais essaie quand même

    perl -pi.orig -e 's/^(.*){3}./$1A/ if 3..3' toto.txt
    lami20j
    0
    1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      Salut lami20j,

      Il y a un hic dans ta syntaxe ;-))
      [jp@MDK tmpfs] $ perl -pi.orig -e 's/^(.*){3}./$1A/ if 3..3' toto.txt
      
      [jp@MDK tmpfs] $ cat toto.txt
      
      123123123
      456456456
      A
      123123123
      456456456
      789789789
      Elle a tout mangé ;-)))
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. looping605 Messages postés 9 Statut Membre
     
    Salut,

    Merci de ton aide.
    J'ai testé la commande perl :
    perl -pi.orig -e 's/^(.*){3}./$1A/ if 3..3' toto.txt

    le soucis est que la troisième ligne est totalement substitué par le caractère "A" :

    Serveur_Test>more toto.txt
    123123123
    456456456
    A

    Je pensais à un truc du genre :

    cat toto.txt | sed -e "3s/7/A/g" > toto.txt_new1

    ais dans ce cas tous les caractères "7" de la 3éme ligne vont être substitués par des caractères "A" comme suit :

    Serveur_Test>more toto.txt_new1
    123123123
    456456456
    A89A89A89

    Et c'est là que je bloque, je ne vois pas comment donner en entrée de ma commande sed la position spécifique de caractère "7" à modifier sans que les autres "7" de cette ligne ne soient modifiés.

    @+
    0
  7. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Re,


    le soucis est que la troisième ligne est totalement substitué par le caractère "A" :


    Oui, je n'ai pas fait attention. C'est de ma faute.
    .* avale la chaine entière ;)

    Essaie
    perl -pi.orig -e 's/^(.{3})./$1A/ if 3..3' toto.txt 
    lami20j
    0
    1. looping605 Messages postés 9 Statut Membre
       
      ça c'est trop bon je prends.
      je te remercit ça fonctionne du tonnerre.
      Même les fichiers qui me posaient problème sont modifiés tranquillement.

      Encore merci de votre aide.

      @+
      0
  8. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Ok c'est nickel comme ça ;-))
    0
    1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
       
      Salut,

      te parles de ma ligne?!

      je suis au boulot et je ne peux pas tester.

      lami20j
      0
      1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898 > lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention  
         
        Oui, de ta ligne en aveugle ;-))
        0
  9. Maryline
     
    Effectivement, la commande perl fonctionne tres bien.
    Mais comment fait-on si on a un enchainement de n caractère à remplacer.
    Dans l'exemple ci dessus, remplacer 789 par AAA ?

    Merci de votre aide.
    0