SHELL-remplacer un ligne dans un fichier-AWK

Résolu/Fermé
kenchyne Messages postés 3 Date d'inscription mardi 3 avril 2007 Statut Membre Dernière intervention 16 avril 2007 - 6 avril 2007 à 17:06
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 - 10 sept. 2013 à 12:13
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!

10 réponses

jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 894
6 avril 2007 à 17:25
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 jeudi 10 mai 2012 Statut Membre Dernière intervention 11 août 2015
10 sept. 2013 à 12:07
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 jeudi 10 mai 2012 Statut Membre Dernière intervention 11 août 2015
10 sept. 2013 à 12:10
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 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
10 sept. 2013 à 12:13
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 jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 894
6 avril 2007 à 22:20
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
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
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
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 Date d'inscription jeudi 29 novembre 2007 Statut Membre Dernière intervention 30 novembre 2007
29 nov. 2007 à 10:38
Merci
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 894
29 nov. 2007 à 11:20
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
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 Date d'inscription jeudi 29 novembre 2007 Statut Membre Dernière intervention 30 novembre 2007
29 nov. 2007 à 11:28
Merci Beaucoup c'est nikel !
0
gigabi Messages postés 3 Date d'inscription jeudi 29 novembre 2007 Statut Membre Dernière intervention 30 novembre 2007
30 nov. 2007 à 08:51
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 jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 894
30 nov. 2007 à 08:55
Tu peux poster un bout de ton fichier sur C-joint, s'teuplé que je puisse faire des tests, merci ;-))
0
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 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
2 mai 2012 à 11:46
Salut,

sed -i.bak 's|'"${var}"'||' vls-pdshd1.cfg 
0
nn :((( j'ai tjr le meme erreurr!!!!!
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
2 mai 2012 à 12:17
C'est peut-être à cause des quotes-doubles dans la variable ;-((

Essaie comme ça :

sed -i.bak 's|'${var}'||' vls-pdshd1.cfg 
0
toujours même erreur!!!! je comprend pas pk!!!
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
2 mai 2012 à 12:25
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