SHELL-remplacer un ligne dans un fichier-AWK
Résolu
kenchyne
Messages postés
3
Date d'inscription
Statut
Membre
Dernière intervention
-
zipe31 Messages postés 36402 Date d'inscription Statut Contributeur Dernière intervention -
zipe31 Messages postés 36402 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!
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!
A voir également:
- Awk replace
- Replace and strike any key when ready traduction ✓ - Forum Disque dur / SSD
- No system disk or disk error replace and strike any key when ready - Forum Windows 7
- Smart status bad backup and replace - Forum Matériel & Système
- Quel site replace coco - Accueil - Réseaux sociaux
- S.M.A.R.T Status Bad, Backup and Replace, données - Forum BIOS
10 réponses
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]$;-))
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 :
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
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.
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.
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?
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 question
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) :
;-))
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.
;-))
Pardon, je reviens sur cette question car lorsque je fais la manipulation avce plus de 250 caractères cela ne fonctionne pas.
Tu peux poster un bout de ton fichier sur C-joint, s'teuplé que je puisse faire des tests, merci ;-))
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
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
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 #################################
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 :