Création
d'entreprise
Posez votre question Signaler

SHELL-remplacer un ligne dans un fichier-AWK [Résolu]

kenchyne 3Messages postés 3 avril 2007Date d'inscription - Dernière réponse le 2 mai 2012 à 16:41
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!
Lire la suite 

SHELL-remplacer un ligne dans un fichier-AWK »

41 réponses
Réponse
+3
moins plus
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]$
;-))
Ajouter un commentaire
Réponse
+1
moins plus
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.
Ajouter un commentaire
Réponse
+0
moins plus
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

kenchyne - 11 avril 2007 à 10:16
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?
Ajouter un commentaire
Réponse
+0
moins plus
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?
Ajouter un commentaire
Réponse
+0
moins plus
Merci
Ajouter un commentaire
Réponse
+0
moins plus
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.

;-))
carpathia - 27 nov. 2008 à 16:25
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
Ajouter un commentaire
Réponse
+0
moins plus
Merci Beaucoup c'est nikel !
Ajouter un commentaire
Réponse
+0
moins plus
Pardon, je reviens sur cette question car lorsque je fais la manipulation avce plus de 250 caractères cela ne fonctionne pas.
Ajouter un commentaire
Réponse
+0
moins plus
Tu peux poster un bout de ton fichier sur C-joint, s'teuplé que je puisse faire des tests, merci ;-))
Ajouter un commentaire
Réponse
+0
moins plus
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
zamouranou - 2 mai 2012 à 15:42
je vous remercie je comprend ce que vous disez mais je pense que le probleme est au niveau de récupération de la variable dans le script car j'ai tjr ce probleme
sed: -e expression #1, char 0: no previous regular expression
sh: BEGIN195: not found
zipe31- 2 mai 2012 à 16:00
Ça doit être au niveau de l'interprétation par "php" :-((

Par contre là je n'y connais pas grand chose, désolé ;-\
zamouranou - 2 mai 2012 à 16:41
merciii bqqq c gentil de ta part :)))) je trouvera une solution sa c sure :)))
Ajouter un commentaire
Ce document intitulé « SHELL-remplacer un ligne dans un fichier-AWK » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
Passage au tout numérique : quel coût pour les particuliers ?