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

Signaler
Messages postés
3
Date d'inscription
mardi 3 avril 2007
Statut
Membre
Dernière intervention
16 avril 2007
-
Messages postés
35601
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
18 septembre 2020
-
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

Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 764
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
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 60363 internautes nous ont dit merci ce mois-ci

Messages postés
40
Date d'inscription
jeudi 10 mai 2012
Statut
Membre
Dernière intervention
11 août 2015

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
Messages postés
40
Date d'inscription
jeudi 10 mai 2012
Statut
Membre
Dernière intervention
11 août 2015

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 =)
Messages postés
35601
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
18 septembre 2020
5 457
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.
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 764
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

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?
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.
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?
Messages postés
3
Date d'inscription
jeudi 29 novembre 2007
Statut
Membre
Dernière intervention
30 novembre 2007

Merci
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 764
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.

;-))
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
Messages postés
3
Date d'inscription
jeudi 29 novembre 2007
Statut
Membre
Dernière intervention
30 novembre 2007

Merci Beaucoup c'est nikel !
Messages postés
3
Date d'inscription
jeudi 29 novembre 2007
Statut
Membre
Dernière intervention
30 novembre 2007

Pardon, je reviens sur cette question car lorsque je fais la manipulation avce plus de 250 caractères cela ne fonctionne pas.
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 764
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
oui c marche avec sed '\|BEGIN "out195"|,\|^##*$|d' fichier
mais moi je veux que le BEGIN "out195" soit $var c'est un script de suppression !!! j'ai modifier le code mtn j'ai presque le meme prob sh: BEGIN195: not found
!!!! c bizareee
Messages postés
35601
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
18 septembre 2020
5 457
Ok, allons-y...

On suppose (mais en fait il faut) que ta variable récupérée ressemble à ça :
$ echo "${var}"
BEGIN "out195"
  DstHost = "225.22.15.15"
  DstPort = "5001"
  TTL     = "2"
  Type    = "multicast"
END

BEGIN "LaunchOnStartUp"

#flux195 = "start hd_h264_2 out195 local1 --loop"

END
#################################

A partir de là, il faut récupérer juste la 1ère ligne et la dernière et mettre le tout en forme pour avoir une syntaxe propre à sed. Avec un truc du genre :
$ echo "${var}" | sed -n '1h;${H;g;s/^\(.*\)\n\(.*\)/\\|\1|,\\|\2|/g;p}'
\|BEGIN "out195"|,\|#################################|


Donc on met ça dans une variable ($A) :
$ A=$(echo "${var}" | sed -n '1h;${H;g;s/^\(.*\)\n\(.*\)/\\|\1|,\\|\2|/g;p}')


Puis on applique ça au fichier de cette façon (là en fait on supprime carrément avec la commande "d" (delete) de sed) :
$ sed "${A}d" BEcoTipLblo_vls-pdshd1.cfg 
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
Messages postés
35601
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
18 septembre 2020
5 457
Ça doit être au niveau de l'interprétation par "php" :-((

Par contre là je n'y connais pas grand chose, désolé ;-\
merciii bqqq c gentil de ta part :)))) je trouvera une solution sa c sure :)))