Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

commandes sed avec reference

11 réponses
Avatar
Kevin Denis
Bonjour

J'ai un fichier contenant des lignes mal formattées.
Ces lignes sont de la forme:

reference: "URL";

au lieu de

reference: URL;

Il y a des lignes 'reference' bien formattées. Il y a beaucoup
d'autres lignes qui n'ont pas à être modifiées. J'ai donc essayé une
commande sed:
sed s/reference:\ \"\(.*\)\"/reference:\ \1/ file

avec l'idée de dire: je cherche le motif
reference: "quelconque" pour réécrire reference: quelconque mais
cela ne fonctionne pas. Ou est-ce que je me trompe?
(Système linux)
Merci
--
Kevin

10 réponses

1 2
Avatar
Kevin Denis
Le 06-02-2013, Kevin Denis a écrit :
J'ai un fichier contenant des lignes mal formattées.
Ces lignes sont de la forme:

reference: "URL";

au lieu de

reference: URL;

Il y a des lignes 'reference' bien formattées. Il y a beaucoup
d'autres lignes qui n'ont pas à être modifiées. J'ai donc essayé une
commande sed:
sed s/reference: "(.*)"/reference: 1/ file

avec l'idée de dire: je cherche le motif
reference: "quelconque" pour réécrire reference: quelconque mais
cela ne fonctionne pas. Ou est-ce que je me trompe?
(Système linux)



C'est toujours après avoir posté qu'on trouve la solution, il faut
prendre le problème différemment:
sed /reference/s/"//g file
fait bien l'affaire. Mais si quelqu'un sait pourquoi ma première méthode
ne fonctionne pas, ça m'intéresse.
Merci
--
Kevin
Avatar
Lucas Levrel
Le 6 février 2013, Kevin Denis a écrit :

Le 06-02-2013, Kevin Denis a écrit :
J'ai un fichier contenant des lignes mal formattées.
Ces lignes sont de la forme:

reference: "URL";

au lieu de

reference: URL;

Il y a des lignes 'reference' bien formattées. Il y a beaucoup
d'autres lignes qui n'ont pas à être modifiées. J'ai donc essayé une
commande sed:
sed s/reference: "(.*)"/reference: 1/ file

avec l'idée de dire: je cherche le motif
reference: "quelconque" pour réécrire reference: quelconque mais
cela ne fonctionne pas. Ou est-ce que je me trompe?
(Système linux)



C'est toujours après avoir posté qu'on trouve la solution, il faut
prendre le problème différemment:
sed /reference/s/"//g file
fait bien l'affaire. Mais si quelqu'un sait pourquoi ma première méthode
ne fonctionne pas, ça m'intéresse.



Pas testé, mais à mon avis il manque les apostrophes pour empêcher le
shell de modifier le motif :
sed 's/reference: "(.*)"/reference: 1/' file

Pour voir, fait
echo s/reference: "(.*)"/reference: 1/



--
LL
Avatar
jca+news
Kevin Denis writes:

Bonjour



'jour,

J'ai un fichier contenant des lignes mal formattées.
Ces lignes sont de la forme:

reference: "URL";

au lieu de

reference: URL;

Il y a des lignes 'reference' bien formattées. Il y a beaucoup
d'autres lignes qui n'ont pas à être modifiées. J'ai donc essayé une
commande sed:
sed s/reference: "(.*)"/reference: 1/ file



Ça manque de quotes. Dans cette expression les parenthèses seront vues
commes littérales par sed, et « 1 » sera vu comme « 1 ».

sed 's/(reference: )"(.*)"/12/'

Après, ceci sous-entend qu'une url ne peut pas contenir de «  " » échappé
(tu n'as pas précisé le format exact de l'url) et qu'il n'y a pas
d'autre « " » après la chaîne « ref erence: "URL" »
(auquel cas le bout de regex « "([^"]*)" » peut à ªtre utilisé).

avec l'idée de dire: je cherche le motif reference: "quelconque" pour
réécrire reference: quelconque mais cela ne fonctionne pas. Ou est-ce
que je me trompe? (Système linux) Merci



Avertissement sans frais : la prochaine fois merci de spécifier la
version de sed (GNU ?), le shell utilisé s'il n'est pas de type b ourne,
ainsi que… le message d'erreur. ;)

Sinon, le plus simple est souvent de s'arranger pour que les données
soient directement formattées correctement, sans avoir à repasser
derrière ton outil.

HTH,
--
Jérémie Courrèges-Anglas
Empreinte GPG : 61DB D9A0 00A4 67CF 2A90 8961 6191 8FBF 06A1 1494
Avatar
Cyrille Lefevre
Le 06/02/2013 12:23, Lucas Levrel a écrit :
Le 6 février 2013, Kevin Denis a écrit :


<snip>
C'est toujours après avoir posté qu'on trouve la solution, il faut
prendre le problème différemment:
sed /reference/s/"//g file
fait bien l'affaire. Mais si quelqu'un sait pourquoi ma première mé thode
ne fonctionne pas, ça m'intéresse.



Pas testé, mais à mon avis il manque les apostrophes pour empêche r le
shell de modifier le motif :



perdu, sa phrase fonctionne très bien, s'il avait mis des apostrophes,
ça aurai donné qqc comme : sed '/reference/s/"//g' tout simplement.

Cordialement,

Cyrille Lefevre.
--
mailto:Cyrille.Lefevre-news%
supprimer "%nospam% et ".invalid" pour me repondre.
Avatar
Cyrille Lefevre
Le 06/02/2013 13:13, Jérémie Courrèges-Anglas a écrit :
Kevin Denis writes:

Bonjour



'jour,

J'ai un fichier contenant des lignes mal formattées.
Ces lignes sont de la forme:

reference: "URL";

au lieu de

reference: URL;

Il y a des lignes 'reference' bien formattées. Il y a beaucoup
d'autres lignes qui n'ont pas à être modifiées. J'ai do nc essayé une
commande sed:
sed s/reference: "(.*)"/reference: 1/ file



Ça manque de quotes. Dans cette expression les parenthèses se ront vues
commes littérales par sed, et « 1 » sera vu comme « 1 ».

sed 's/(reference: )"(.*)"/12/'

Après, ceci sous-entend qu'une url ne peut pas contenir de « " » échappé
(tu n'as pas précisé le format exact de l'url) et qu'il n'y a pas
d'autre « " » après la chaîne « reference: "UR L" »
(auquel cas le bout de regex « "([^"]*)" » peut être u tilisé).



Bonjour,

ah mince, c'est la soluce que je voulais proposé, mais je n'avais pa s vu
que tu en parlais au 1er regard...

supposition, il n'y a pas de " échappé dans une url, si tel à ©tait le
cas, il serait encodé en %22, non ?

pour autant, pour qu'ils voient la différence :

v2$ echo 'reference: "blah"blah"' | sed '/reference/s/"(..*)"/1/'
reference: blah"blah

supposition de base, y a toujours qqc entre les ", d'ou ..* équivale nt à
.+, mais sed ne connaissant pas les re extended, sauf GNU sed avec
l'option -r, alternative : .{1,}, mais c'est plus long à taper :-)

v2$ echo 'reference: "blah"blah"' | sed '/reference/s/"([^"]{1,})"/1 /'
reference: blahblah"

IMHO, l'expression suivante déjà citée suffit :

v2$ echo 'reference: "blah"blah"' | sed '/reference/s/"//g'
reference: blahblah

Avertissement sans frais : la prochaine fois merci de spécifier la
version de sed (GNU ?), le shell utilisé s'il n'est pas de type bo urne,
ainsi que… le message d'erreur. ;)



pas besoin de GNU sed ici, on s'en fout donc :-)

Cordialement,

Cyrille Lefevre.
--
mailto:Cyrille.Lefevre-news%
supprimer "%nospam% et ".invalid" pour me repondre.
Avatar
Lucas Levrel
Le 6 février 2013, Cyrille Lefevre a écrit :

Le 06/02/2013 12:23, Lucas Levrel a écrit :
Le 6 février 2013, Kevin Denis a écrit :


<snip>
C'est toujours après avoir posté qu'on trouve la solution, il faut
prendre le problème différemment:
sed /reference/s/"//g file
fait bien l'affaire. Mais si quelqu'un sait pourquoi ma première méthode
ne fonctionne pas, ça m'intéresse.



Pas testé, mais à mon avis il manque les apostrophes pour empêcher le
shell de modifier le motif :



perdu, sa phrase fonctionne très bien, s'il avait mis des apostrophes, ça
aurai donné qqc comme : sed '/reference/s/"//g' tout simplement.



Je parlais bien sûr du premier motif, celui qui ne fonctionne pas et qui
contient notamment une *. C'était parfaitement clair d'après la portion de
mon message que tu as coupée.

--
LL
Avatar
Kevin Denis
Le 06-02-2013, Lucas Levrel a écrit :

Pas testé, mais à mon avis il manque les apostrophes pour empêcher le
shell de modifier le motif :
sed 's/reference: "(.*)"/reference: 1/' file



Effectivement, avec les apostrophes, ça passe aussi.
Merci
--
Kevin
Avatar
Kevin Denis
Le 06-02-2013, Jérémie Courrèges-Anglas <jca+ a écrit :
Il y a des lignes 'reference' bien formattées. Il y a beaucoup
d'autres lignes qui n'ont pas à être modifiées. J'ai donc essayé une
commande sed:
sed s/reference: "(.*)"/reference: 1/ file



Ça manque de quotes. Dans cette expression les parenthèses seront vues
commes littérales par sed, et « 1 » sera vu comme « 1 ».

sed 's/(reference: )"(.*)"/12/'



Ok, merci.

Après, ceci sous-entend qu'une url ne peut pas contenir de « " » échappé
(tu n'as pas précisé le format exact de l'url) et qu'il n'y a pas
d'autre « " » après la chaîne « reference: "URL" »



Ce qui est le cas.

Avertissement sans frais : la prochaine fois merci de spécifier la
version de sed (GNU ?), le shell utilisé s'il n'est pas de type bourne,
ainsi que??? le message d'erreur. ;)



système linux, donc 99.9% de chance que ce soit le GNU sed avec un bash :)

Sinon, le plus simple est souvent de s'arranger pour que les données
soient directement formattées correctement, sans avoir à repasser
derrière ton outil.



Données rentrées manuellement par plusieurs contributeurs..
--
Kevin
Avatar
jca+news
Kevin Denis writes:

[...]

Avertissement sans frais : la prochaine fois merci de spécifie r la
version de sed (GNU ?), le shell utilisé s'il n'est pas de typ e bourne,
ainsi que... le message d'erreur. ;)



système linux, donc 99.9% de chance que ce soit le GNU sed avec un b ash :)



:~$ sed --version
This is not GNU sed version 4.0
:~$ echo "$SHELL"
/bin/ash
:~$

le 0.01% ;)

Sinon, le plus simple est souvent de s'arranger pour que les données
soient directement formattées correctement, sans avoir à repas ser
derrière ton outil.



Données rentrées manuellement par plusieurs contributeurs..



Eh bien… corrige tes contributeurs. cf. lart(1)

--
Jérémie Courrèges-Anglas
Empreinte GPG : 61DB D9A0 00A4 67CF 2A90 8961 6191 8FBF 06A1 1494
Avatar
william
On 2013-02-06, Kevin Denis wrote:
[probleme sur sed]

Moi aussi j'utilise souvent sed mais aussi awk et tout ca ...
Mais une question me vient a l'esprit. Ne faut il pas mieux chercher une
solution autour de python ?

Na, c est pas un troll. A une epoque je cherchais a resoudre ce genre de
probleme avec perl. Mais plus tard quand je reprenais un script perl, je me
rends compte qu'il faut que je reapprenne a nouveau perl (n'utilisant pas tous
les jours).

Du coup, pour faire des choses un peu poussé (c'est à dire utilisation de
sed/grep/cut/paste) ne vaut il pas mieux passer par du python qui est plus
lisible que le perl ?

(vraie question)
1 2