SHELL-remplacer un ligne dans un fichier-AWK

Résolu
kenchyne Messages postés 3 Statut Membre -  
zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

J'essaye de remplacer une chaine de caracteres qui est stockée dans une variable et ensuite d'effectuer une recherche puis un remplacement dans un fichier.

voici un petit bout du script:

mot_a_rechercher="toto"
fic=/usr/users/toto/fichier

#Ouverture du fichier et invocation de la variable shell puis remplacement de ce mot par * $mot commentaire

cat $fic | awk -v myvar="$mot_a_remplacer '{sub('/'myvar'/\* 'myvar' commentaire)} {print}'

#A la fin je souhaite trouver comme resultat un cat du fichier avec le remplacement de la chaine de caracteres modifiée avec la meme position de ligne

Les questions sont les suivantes:
-Comment invoquer ma variable dans un programme awk?
-Comment utiliser le sub de awk en y inserant cette variable?

Remarques:
J'utilise un awk car ce bout de script est utilisé dans une boucle FOR, si j'utilise un SED, je me retrouve avec plusieurs contenu de fichier. Le sed -i -e "s/$mot_a_remplacer/\* $mot_a_remplacer/g" $fic n'est pas faisable sous mon OS....bizarre...

Merci d'avance!
Configuration: Windows XP
Internet Explorer 6.0
AIX
SUN SOLARIS

10 réponses

Résumé de la discussion

Il s'agit de remplacer une chaîne stockée dans une variable dans un fichier via awk et d'utiliser ensuite cette variable dans l'opération de remplacement correctement. Des réponses montrent comment invoquer la variable dans awk, soit par -v var='valeur' soit par concaténation dans le motif, et comment appeler sub pour remplacer la correspondance par un texte fixé. Un exemple simple montre comment remplacer Toto par Tata dans un fichier en utilisant awk et sub, en injectant la variable dans le motif pour afficher le résultat. Certaines réponses évoquent aussi des alternatives avec sed, dépendant de la version et de l'OS, et proposent l'utilisation d'un fichier temporaire lorsque -i est indisponible.

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
     
    Salut,
    myvar="toto"
    cat $fic | awk '{ sub(/'$myvar'/,"commentaire"); print}'
    Petit exemple :
    [jp@MDK trash]$ cat fich.txt
    
    Je m'appelle Toto
    et moi Tutu
    et mon frère Titi.
    
    [jp@MDK trash]$ var="Toto"
    
    [jp@MDK trash]$ cat fich.txt | awk '{ sub(/'$var'/,"Tata");print}'
    
    Je m'appelle Tata
    et moi Tutu
    et mon frère Titi.
    
    [jp@MDK trash]$
    ;-))
    10
    1. sym59 Messages postés 40 Date d'inscription   Statut Membre Dernière intervention  
       
      Salut!

      Ca marche nickel!
      Mais comment remplacer une ligne entière par "Tata" uniquement si cette ligne contient "appelle" ?
      (désolé pour les 6 ans de retards)

      Merci
      0
    2. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Salut,

      Sinon avec sed :

      $ cat plop 
      Je m'appelle Toto
      et moi Tutu
      et mon frère Titi.

      $ sed '/appelle/cTata' plop
      Tata
      et moi Tutu
      et mon frère Titi.
      0
  2. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    si j'utilise un SED, je me retrouve avec plusieurs contenu de fichier. Le sed -i -e "s/$mot_a_remplacer/\* $mot_a_remplacer/g" $fic n'est pas faisable sous mon OS....bizarre...
    Non, pas tant que ça. Ça dépend en fait de la version de "sed".
    Le switch "-i" ne fonctionne qu'avec les version supérieures à 3.02 (GNU-sed), et je pense que sous Solaris, ta version doit être inférieure.

    Mais néanmoins tu peux passer par un fichier temporaire :
    sed -e 's/'$var'/commentaire/' < fichier > fichier.tmp
    mv fichier.tmp fichier

    1
    1. kenchyne
       
      Merci!!ca marche mais j'ai un peu modifier ;-)!

      Par contre g un problème avec un grep :
      grep "^set s" $fic > fic_tmp

      cat fic_tmp :
      il n'y a pas toutes les lignes que je veux...

      par contre en ligne de commande, ça marche...

      bizarre?
      0
  3. gigabi
     
    Pardon je n'ai pais eu le temps de revenir avant,

    j'ai trouvé une autre commande : (remplace les é par des e dans les 440 premiers caractères de chaque ligne du fichier)

    awk '{ temp=substr($0,1,440) ; gsub("é","e",temp) ; print temp substr($0,441) } ' fic > fic2

    Merci bcp pour ton aide.
    1
  4. gigabi
     
    Bonjour

    je voudrais remplacer dans une chaine les caractères accentués par des non accentués mais cela uniquement sur les 200 premiers caractères de chaque ligne. Avez-vous une idée pour faire cela?
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. gigabi Messages postés 3 Statut Membre
     
    Merci
    0
  7. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Salut,

    La prochaine fois ouvre un nouveau thread plutôt que de poster à la suite d'un post n'ayant aucun rapport avec ta requête, t'auras plus de chance d'obtenir une réponse !

    Tiens tu peux essayer de faire ça avec "GNU sed" (rajoute l'option "-i" pour la modification du fichier et "-i.BAK" pour une sauvegarde du fichier original) :
    $ cat plop
    
    àaéeèeôoùuïiàaéeèeôoùuïiàaéeèeôoùuïiàaéeèeôoùuïié
    ÀaéeÈeôoùuïiàaéeèeôoùuïiàaéeèeôoùuïiàaéeèeôoùuïié
    àaéeèeôoùuïiàaéeèeôoùuïiàaéeèeôoùuïiàaéeèeôoùuïié
    àaéeèeÔoùuïiàaéeèeôoùuïiàaéeèeôoùuïiàaéeèeôoùuïié
    àaÉeèeôoùuïiàaéeèeôoùuïiàaéeèeôoùuïiàaéeèeôoùuïié
    
    $ sed '
    h
    s/\(^.\{12\}\).*/\1/
    y/àâéèêëîïôöùûü/aaeeeeiioouuu/
    y/ÀÂÉÈÊËÎÏÔÖÙÛÜ/AAEEEEIIOOUUU/
    x
    s/^.\{12\}\(.*\)/\1/
    x
    G
    s/\n//
    ' plop
    
    aaeeeeoouuiiàaéeèeôoùuïiàaéeèeôoùuïiàaéeèeôoùuïié
    AaeeEeoouuiiàaéeèeôoùuïiàaéeèeôoùuïiàaéeèeôoùuïié
    aaeeeeoouuiiàaéeèeôoùuïiàaéeèeôoùuïiàaéeèeôoùuïié
    aaeeeeOouuiiàaéeèeôoùuïiàaéeèeôoùuïiàaéeèeôoùuïié
    aaEeeeoouuiiàaéeèeôoùuïiàaéeèeôoùuïiàaéeèeôoùuïié
    
    $
    Remplace "12" par "200" dans ton cas.

    ;-))
    0
    1. carpathia
       
      bonjour spicy

      merci toujour pour votre aide ,s'il te plait esqu'il ya une doc (tuto awk ) faite par vous si oui envoi moi

      cette doc


      j'appricie votre support et aide
      0
  8. gigabi Messages postés 3 Statut Membre
     
    Merci Beaucoup c'est nikel !
    0
  9. gigabi Messages postés 3 Statut Membre
     
    Pardon, je reviens sur cette question car lorsque je fais la manipulation avce plus de 250 caractères cela ne fonctionne pas.
    0
  10. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Tu peux poster un bout de ton fichier sur C-joint, s'teuplé que je puisse faire des tests, merci ;-))
    0
  11. zamouranou
     
    Bonjour svpp j'ai un probleme avec cette commande :

    sed -i.bak "s/$var//" vls-pdshd1.cfg
    $var est BEGIN"194" Name = "hd_h264_2" FileName = "/home/flux/SD/hd_h264_1.ts" # Type = "Mpeg2-TS" END BEGIN "Channels" out194 = "network" END BEGIN "out194" DstHost = "225.22.15.15" DstPort = "5001" TTL = "2" Type = "multicast" END BEGIN "LaunchOnStartUp" #flux194 = "start hd_h264_2 out194 local1 --loop" END #################################

    j'ai tjr ce erreurr:
    sh: BEGIN194: not found
    sh: Name: not found
    sh: FileName: not found
    sh: END: not found
    sh: BEGIN: not found
    sh: out194: not found
    sh: END: not found
    sh: BEGIN: not found
    sh: DstHost: not found
    sh: DstPort: not found
    sh: TTL: not found
    sh: Type: not found
    sh: END: not found
    sh: BEGIN: not found
    sh: END: not found
    0
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Salut,

      sed -i.bak 's|'"${var}"'||' vls-pdshd1.cfg 
      0
    2. zamouranou
       
      nn :((( j'ai tjr le meme erreurr!!!!!
      0
    3. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      C'est peut-être à cause des quotes-doubles dans la variable ;-((

      Essaie comme ça :

      sed -i.bak 's|'${var}'||' vls-pdshd1.cfg 
      0
    4. zamouranou
       
      toujours même erreur!!!! je comprend pas pk!!!
      0
    5. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      On peut avoir un exemple du contenu de ton fichier ?

      Le contenu de la variable $var est bien :

      BEGIN"194" Name = "hd_h264_2" FileName = "/home/flux/SD/hd_h264_1.ts" # Type = "Mpeg2-TS" END BEGIN "Channels" out194 = "network" END BEGIN "out194" DstHost = "225.22.15.15" DstPort = "5001" TTL = "2" Type = "multicast" END BEGIN "LaunchOnStartUp" #flux194 = "start hd_h264_2 out194 local1 --loop" END #################################
      0