bonjour à tous,
j'essaye tant bien que mal d'utiliser la fonction sed avec les regex mais j'ai un peu de mal.
j'ai un fichier avec 6 colonnes, séparateur tab. (toutes les colonnes sauf la dernière sont obligatoires).
les colonnes peuvent contenir le caractère * sauf les colonnes 2 et 5. la colonne 2 est la clef du fichier (ie jamais 2 lignes avec la même valeur en colonne 2).
voici un exemple
A test * * ici
AA test2 * * la
A uneautreclef * * la
B avantdernier * * ici
C dernier * * la
je souhaiterai remplacer le mot "ici" dans la ligne dont la colonne 2 est avantdernier par "salut".
ce qui donnerait au final:
A test * * ici
AA test2 * * la
A uneautreclef * * la
B avantdernier * * salut
C dernier * * la
je n'y arrive pas….
merci
# awk
Posté par Anthony Jaguenaud . Évalué à 1.
Awk permet de traiter un fichier ligne par ligne en matchant des regex ou des valeurs de champs.
Un truc du genre devrait marcher à peu près.
[^] # Re: awk
Posté par jb . Évalué à 3.
je pense que tu n'as pas pris en compte tous les paramètres de mon énoncé.
avec awk pas de souci, je ferai un test sur $2 puis un print en remplaçant le $5 avec je que je souhaite substituer.
dans mon cas, je souhaite utiliser sed. Cela doit être possible….
[^] # Re: awk
Posté par freem . Évalué à 2.
Oui et non…
Si le problème est que ton script marche pour toutes les avant-dernières lignes, sed seul ne pourra pas le faire: c'est un éditeur de ligne, pas de fichier, il est incapable de dire si une ligne est l'avant-dernière ou la première, contrairement à awk.
En revanche, si ce que tu cherches est manipuler un modèle sur une ligne ou s'en trouve un autre, alors sed peut le faire, un exemple de réponse est donné dans un autre commentaire.
Au cas où, je trouve ce lien plutôt utile quand je dois travailler avec du shell et que je suis bloque sur un truc.
[^] # Re: awk
Posté par Kangs . Évalué à 1.
S'il n'avait pas dit je souhaite modifier le contenu de la 5e colonne correspondant à la clef 'avantdernier' (la clef étant la 2e colonne) mais, je souhaite modifier le contenu de la 5e colonne de l'avant dernière ligne, alors le code correspondant aurait été :
[^] # Re: awk
Posté par Kangs . Évalué à 1.
J'avais oublié :
[^] # Re: awk
Posté par Yves Bourguignon . Évalué à 3.
Tu voulais plutôt dire : ce lien
[^] # Re: awk
Posté par freem . Évalué à 2.
En effet, oublié le http… oups.
[^] # Re: awk
Posté par Anthony Jaguenaud . Évalué à 2.
Je suis navré, je croyais que tu cherchais une solution et j’ai essayé d’utiliser l’outil qui me semblait le plus adapté pour résoudre ton problème tel que je l’avais compris. Mais si le but était le défi intellectuel de le faire avec
sed
effectivement, j’ai répondu a côté de la plaque… tu m’en vois navré.[^] # Re: awk
Posté par totof2000 . Évalué à 2.
On peut faire mieux, un truc du genre :
($5=="ici"){$5 = "salut";print $0}'
[^] # Re: awk
Posté par Anthony Jaguenaud . Évalué à 2.
Merci, je ne savais pas qu’on pouvait utiliser $x en lvalue.
[^] # Re: awk
Posté par jb . Évalué à 1.
pas grave :)
en tout cas, j'ai utilisé le sed donné plus bas (en modifiant legèrement car mon besoin était légèrement différent).
merci
[^] # Re: awk
Posté par totof2000 . Évalué à 3.
C'est le truc à savoir et qui change la vie avec awk.
Certains utilisent python pour ce genre de traitements, mais personnellement, je trouve que les regexp en python c'est pas génial (c complètement pourri mêm je trouve). Pour les regexp, ya pas mieux que shell et commandes style sed/awk/tr ou Perl.
# Comme ca
Posté par Kangs . Évalué à 1.
Ajouter
-i
pour modifier le fichier.Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.