Specifier numéro du champ, command sed ou awk
Résolu/Fermé
A voir également:
- Specifier numéro du champ, command sed ou awk
- Numero prive - Guide
- Numéro père noël whatsapp - Accueil - Messagerie instantanée
- A qui appartient ce numéro - Guide
- Word numéro de page 1/2 - Guide
- Numero imei - Guide
2 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 897
30 avril 2010 à 17:00
30 avril 2010 à 17:00
Salut,
2 solutions. Si tu sais quelle occurrence remplacée, 1ère solution, si tu ne sais pas le nombre d'occurrences à l'avance, 2nd solution :
;-))
2 solutions. Si tu sais quelle occurrence remplacée, 1ère solution, si tu ne sais pas le nombre d'occurrences à l'avance, 2nd solution :
jp@jp-kermic:~$ cat teab fichier: str1 str2 oldstr fichier:str1 oldstr oldstr jp@jp-kermic:~$ sed 's/oldstr/newstr/2' teab fichier: str1 str2 oldstr fichier:str1 oldstr newstr jp@jp-kermic:~$ sed 's/\(.*\)oldstr/\1newstr/' teab fichier: str1 str2 newstr fichier:str1 oldstr newstr jp@jp-kermic:~$
;-))
dubcek
Messages postés
18758
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
24 décembre 2024
5 623
5 mai 2010 à 12:07
5 mai 2010 à 12:07
hello
pour change partiellement ou entèrement un champ spécifique avec awk
pour change partiellement ou entèrement un champ spécifique avec awk
$ echo olstr oldstr oldstr oldstr | awk -v c=3 '{sub("old", "new", $c);print}' olstr oldstr newstr oldstr $ $ echo olstr oldstr oldstr oldstr | awk -v c=2 '{sub("old", "new", $c);print}' olstr newstr oldstr oldstr $ $ echo olstr oldstr oldstr oldstr | awk -v c=2 '{$c="newstr";print}' olstr newstr oldstr oldstr $ $ echo olstr oldstr oldstr oldstr | awk -v c=4 '{$c="newstr";print}' olstr oldstr oldstr newstr $
dubcek
Messages postés
18758
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
24 décembre 2024
5 623
Modifié par dubcek le 5/05/2010 à 14:11
Modifié par dubcek le 5/05/2010 à 14:11
à la différence de l'option -i de sed, il faut passer par un autre fichier
awk -v c=4 'NR=4 {$c="newstr";print}' toto.txt > toto2.txt
mv toto.txt toto.bak ; mv toto2.txt toto.txt
attention : NR=4 : ne serait-ce pas plutot NR==4 si la ligne 4 ?
awk -v c=4 'NR=4 {$c="newstr";print}' toto.txt > toto2.txt
mv toto.txt toto.bak ; mv toto2.txt toto.txt
attention : NR=4 : ne serait-ce pas plutot NR==4 si la ligne 4 ?
dubcek
Messages postés
18758
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
24 décembre 2024
5 623
5 mai 2010 à 14:41
5 mai 2010 à 14:41
effectivement, le print ne s'applique qu'aux lignes modifiées, pour imprimer toutes les lignes, faire
awk -v c=4 'NR==4 {$c="newstr"}; {print}' toto.txt
ok alors la en effet tout est écrit dans le fichier!
MAIS cette méthode engendre un problème.
Voici ma ligne type dans mon fichier toto.txt
1.96000E+03 0.00000E+00 0.00000E+00 | XX = f(Q HP etg.2)
En procédant comme tu me l'as précisé, l'espace de début de ligne est supprimé, les deux espaces entre les champs se transforment en un seul espace et le vide entre le dernier champ et le | également.
Or ce fichier doit être rigoureusement formatter de la même manière que celui d'origine.
As tu une astuce? Ou dois-je me lancer sur une toute autre piste?
Merci pour ton aide précieuse.
MAIS cette méthode engendre un problème.
Voici ma ligne type dans mon fichier toto.txt
1.96000E+03 0.00000E+00 0.00000E+00 | XX = f(Q HP etg.2)
En procédant comme tu me l'as précisé, l'espace de début de ligne est supprimé, les deux espaces entre les champs se transforment en un seul espace et le vide entre le dernier champ et le | également.
Or ce fichier doit être rigoureusement formatter de la même manière que celui d'origine.
As tu une astuce? Ou dois-je me lancer sur une toute autre piste?
Merci pour ton aide précieuse.
4 mai 2010 à 17:00
Je ne connais effectivement pas l'occurence.
Donc je me suis tourné vers ta seconde méthode. Le problème est que j'ai besoin de spécifier la ligne dans la commande sed; si je la spécifie, et que je run mon script, toute la ligne est remplacée!
Erreur de ma part ou est-ce normal?
Que me conseillez-vous?
Cordialement,
teab
4 mai 2010 à 17:50
;-))
5 mai 2010 à 09:33
Toutefois, elle me semble limitée. Je m'explique. Imaginons que j'ai en fait cette ligne:
4 olstr oldstr oldstr
Je veux cette fois remplacer uniquement le deuxième champ par newstr. C'est faisable avec la première méthode que tu avais proposé, mais cela m'oblige à rajouter une ligne de code en faisant une boucle conditionnelle. C'est pour ça que je cherchais une méthode qui me permettre de spécifier le numéro du champ et non de l'occurence.
Tu vois ce que je veux dire?
Si tu n'as pas mieux ce n'est pas grave, c'est déjà très bien!
5 mai 2010 à 10:16
une méthode qui me permettre de spécifier le numéro du champ et non de l'occurence.
Sed n'est pas fait pour ça ;-(
Sed est un éditeur de flux orienté ligne et non un éditeur de flux orienté champ. Pour ça il te faut te tourner vers "awk", qui lui est prévu pour traiter les "champs".
5 mai 2010 à 10:31
J'arrive à l'utiliser pour la lecture de fichier, mais pas pour le remplacement!