rss
Rechercher : dans
Par : Pertinence Date Nom d'utilisateur
Statut : Résolu

SHELL-remplacer un ligne dans un fichier-AWK

kenchyne, le vendredi 6 avril 2007 à 17:06:02
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
Répondre à kenchyne  Signaler ce message aux modérateurs Aller au dernier message

1


  • 2
    Ce message vous semble utile, votez !
  • Ce message ne vous semble pas utile, votez !
  • Signaler ce message aux modérateurs
jipicy, le vendredi 6 avril 2007 à 17:25:26
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]$
;-))
Z'@+...che.
JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.
Répondre à jipicy

2


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
jipicy, le vendredi 6 avril 2007 à 22:20:58
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

Z'@+...che.
JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.
Répondre à jipicy

3


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
kenchyne, le mercredi 11 avril 2007 à 10:16:29
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?
Répondre à kenchyne

4


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
gigabi, le jeudi 29 novembre 2007 à 10:35:29
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?
Répondre à gigabi

5


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
gigabi, le jeudi 29 novembre 2007 à 10:38:57
Merci
Répondre à gigabi

6


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
jipicy, le jeudi 29 novembre 2007 à 11:20:29
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.

;-))
Z'@+...che.
JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.
Répondre à jipicy

7


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
gigabi, le jeudi 29 novembre 2007 à 11:28:19
Merci Beaucoup c'est nikel !
Répondre à gigabi

8


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
gigabi, le vendredi 30 novembre 2007 à 08:51:34
Pardon, je reviens sur cette question car lorsque je fais la manipulation avce plus de 250 caractères cela ne fonctionne pas.
Répondre à gigabi

9


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
jipicy, le vendredi 30 novembre 2007 à 08:55:38
Tu peux poster un bout de ton fichier sur C-joint, s'teuplé que je puisse faire des tests, merci ;-))

Z'@+...che.
JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.
Répondre à jipicy

10


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
 gigabi, le lundi 3 décembre 2007 à 11:07:08
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.
Répondre à gigabi
Logiciels pertinents trouvés dans les téléchargements
Télécharger WinMerge 2.8.6WinMerge - WinMerge est un outil libre permettant de comparer visuellement des fichiers textes et de simplifier la fusion de leurs...Catégorie: Développement
Licence: Open Source
Télécharger FlyakiteOSX   3.0FlyakiteOSX - FlyakiteOSX est un pack de transformation ou de personnalisation de Windows XP. Il permet de transformer l'apparence externe...Catégorie: Emulation
Licence: Freeware/gratuit
Télécharger SSH Secure Shell 3.0 build 203SSH Secure Shell - SSH secure shell for workstations est un client SSH flexible permettant de se connecter de façon sécurisée à des...Catégorie: Telnet/SSH
Licence: Open Source
Télécharger ShellEnhancer  3.0.0.91ShellEnhancer - ShellEnchancer est un programme d'amélioration des fonctions de base de Windows. Il rend les interfaces plus stables et plus...Catégorie: Personnalisation
Licence: Freeware/gratuit
Plus de logiciels gratuits sur « SHELL remplacer un ligne dans un fichier AWK »