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
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
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
sym59 Messages postés 40 Date d'inscription   Statut Membre Dernière intervention  
 
C'est good!
Il fallait que je demande pour trouver :

https://forums.commentcamarche.net/forum/affich-16211313-awk-remplacer-une-ligne-d-un-fichier

désolé du dérangement =)
0
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
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
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
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
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
gigabi Messages postés 3 Statut Membre
 
Merci
0
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
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
gigabi Messages postés 3 Statut Membre
 
Merci Beaucoup c'est nikel !
0
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
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
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
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
zamouranou
 
nn :((( j'ai tjr le meme erreurr!!!!!
0
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
zamouranou
 
toujours même erreur!!!! je comprend pas pk!!!
0
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