SHELL-remplacer un ligne dans un fichier-AWK
Résoluzipe31 Messages postés 34620 Date d'inscription Statut Contributeur Dernière intervention -
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
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.
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]$;-))
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
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.
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?
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionLa 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.
;-))
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
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 #################################
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
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 =)
Sinon avec sed :