Sed et retour à la ligne
Résolu/Fermé
radgeur
Messages postés
201
Date d'inscription
samedi 25 septembre 2010
Statut
Membre
Dernière intervention
20 juin 2012
-
19 juin 2012 à 12:03
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 - 20 juin 2012 à 10:43
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 - 20 juin 2012 à 10:43
A voir également:
- Sed et retour à la ligne
- Aller à la ligne excel - Guide
- Ligne occupée - Forum SFR
- Echo retour à la ligne ✓ - Forum Shell
- Retour à la ligne google sheet - Forum Google Docs
- Partager photos en ligne - Guide
4 réponses
zipe31
Messages postés
36402
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 420
19 juin 2012 à 16:24
19 juin 2012 à 16:24
Re-
;-))
$ cat plop $req_joueurs= reqmysql('SELECT * FROM 'joueurs_internationaux' ORDER BY nom'); $req_param = reqmysql(' SELECT * FROM 'droit' JOIN 'table' SELECT * FROM 'droit' JOIN 'table' WHERE 'module'="livredor" AND 'page'="signer"; ') ; $ cat script.sed #n :z /^$/{ p b } /) *;$/ { s/\($[^ ]*[^=]*\)\( *=[^)]*) *;\)$/\1\2\n\1->execute();/ p b } /) *;$/ !{ N b z p } $ sed -f script.sed plop $req_joueurs= reqmysql('SELECT * FROM 'joueurs_internationaux' ORDER BY nom'); $req_joueurs->execute(); $req_param = reqmysql(' SELECT * FROM 'droit' JOIN 'table' SELECT * FROM 'droit' JOIN 'table' WHERE 'module'="livredor" AND 'page'="signer"; ') ; $req_param ->execute(); $
;-))
zipe31
Messages postés
36402
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 420
19 juin 2012 à 13:48
19 juin 2012 à 13:48
Salut,
Sed ne travaille que sur un flux contenu dans sa mémoire principale. En règle générale ce flux ne correspond qu'à une seule ligne d'un fichier. Pour que sed travaille sur un ensemble de lignes il faut concaténer ses lignes dans sa mémoire principale, et à partir de là la reconnaissance des fins de ligne peut être ciblée.
Il nous faudrait avoir des exemples précis et concrets des différents cas présents dans tes fichiers pour qu'on puisse t'aider ;-\
Sed ne travaille que sur un flux contenu dans sa mémoire principale. En règle générale ce flux ne correspond qu'à une seule ligne d'un fichier. Pour que sed travaille sur un ensemble de lignes il faut concaténer ses lignes dans sa mémoire principale, et à partir de là la reconnaissance des fins de ligne peut être ciblée.
Il nous faudrait avoir des exemples précis et concrets des différents cas présents dans tes fichiers pour qu'on puisse t'aider ;-\
radgeur
Messages postés
201
Date d'inscription
samedi 25 septembre 2010
Statut
Membre
Dernière intervention
20 juin 2012
27
19 juin 2012 à 14:55
19 juin 2012 à 14:55
Dans les fichiers que j'ai a changer je peux tomber sur 2 cas distincts a remplacer :
Tout d'abord le premier, plus simple et plus courant :
$req_joueurs = reqmysql('SELECT * FROM 'joueurs_internationaux' ORDER BY nom');
Là, la première commande que j'ai créer fonctionne parfaitement et effectue bien ce que je souhaite.
Ensuite le deuxième que je peux rencontrer est le suivant :
$req_param = reqmysql('
SELECT * FROM 'droit' JOIN 'table'
SELECT * FROM 'droit' JOIN 'table'
WHERE 'module'="livredor" AND 'page'="signer";
') ;
et c'est celui là qui me pose problème, car je n'arrive pas à gérer convenablement les retours à la ligne, une action est bien effectuer, mais parfois effectuer plusieurs fois, je ne sais pourquoi et j'arrive donc parfois à la chose suivante:
$req_param = reqmysql('
SELECT * FROM 'droit' JOIN 'table'
SELECT * FROM 'droit' JOIN 'table'
WHERE 'module'="livredor" AND 'page'="signer";
') ;
$req_param->execute();
$req_param->execute();
$req_param->execute();
Alors que je souhaiterais que la ligne d'execute() ne soit écrite qu'une seule fois.
Tout d'abord le premier, plus simple et plus courant :
$req_joueurs = reqmysql('SELECT * FROM 'joueurs_internationaux' ORDER BY nom');
Là, la première commande que j'ai créer fonctionne parfaitement et effectue bien ce que je souhaite.
Ensuite le deuxième que je peux rencontrer est le suivant :
$req_param = reqmysql('
SELECT * FROM 'droit' JOIN 'table'
SELECT * FROM 'droit' JOIN 'table'
WHERE 'module'="livredor" AND 'page'="signer";
') ;
et c'est celui là qui me pose problème, car je n'arrive pas à gérer convenablement les retours à la ligne, une action est bien effectuer, mais parfois effectuer plusieurs fois, je ne sais pourquoi et j'arrive donc parfois à la chose suivante:
$req_param = reqmysql('
SELECT * FROM 'droit' JOIN 'table'
SELECT * FROM 'droit' JOIN 'table'
WHERE 'module'="livredor" AND 'page'="signer";
') ;
$req_param->execute();
$req_param->execute();
$req_param->execute();
Alors que je souhaiterais que la ligne d'execute() ne soit écrite qu'une seule fois.
radgeur
Messages postés
201
Date d'inscription
samedi 25 septembre 2010
Statut
Membre
Dernière intervention
20 juin 2012
27
19 juin 2012 à 16:31
19 juin 2012 à 16:31
Re-,
Merci bien pour ta réponse, apparemment tu as trouver comment faire toi, mais ce serais possible d'avoir un peu de texte(explication), parce que là tu me balance du code brute et je ne saurais dire quoi correspond à quoi.
Merci d'avance.
Merci bien pour ta réponse, apparemment tu as trouver comment faire toi, mais ce serais possible d'avoir un peu de texte(explication), parce que là tu me balance du code brute et je ne saurais dire quoi correspond à quoi.
Merci d'avance.
zipe31
Messages postés
36402
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 420
Modifié par zipe31 le 19/06/2012 à 17:15
Modifié par zipe31 le 19/06/2012 à 17:15
#n
Affichage sur commande uniquement
:z
On pose une étiquette
/^$/{
Motif correspondant à une ligne vide avec regroupement de commande entre les accolades
p
On imprime
b
Et on se branche à la fin du script, autrement dit le reste des commandes ne sera pas évalué pour ce motif
}
Fin du regroupement de commandes
/) *;$/ {
Motif correspondant à une fin de ligne (le $ en fin) finissant par une parenthèse fermante suivie ou pas d'un espace suivi d'un point virgule.
s/\($[^ ]*[^=]*\)\( *=[^)]*) *;\)$/\1\2\n\1->execute();/
Les substitutions avec référence-arrière. J'ai juste modifié leur nombre et la façon de matcher les motifs.
\($[^ ]*[^=]*\)
On matche tout jusqu'à ce qu'on rencontre un espace ou un signe égale. Le "[^=]" exclue le signe égale de la recherche.
\( *=[^)]*) *;\)$
Idem avec la parenthèse fermante. On cherche un motif commençant ou pas par un espace suivi du signe égale jusqu'à ce qu'on rencontre une parenthèse fermante, qu'on capture en l'incluant dans la référence-arrière. Le "$" à la fin signifie qu'on cherche une fin de ligne.
p
Si correspondance il y a c'est affiché
b
Et on se branche à la fin du script
}
Fin du regroupement de commandes
/) *;$/ !{
Si la ligne ne correspond pas (! indique la négation) au motif
N
On ajoute la ligne suivante
b z
Et on se branche à l'étiquette pour boucler (le "p" était en trop dans mon exemple ;-( )
}
Fin du regroupement de commandes
Apparemment l'affichage sur commande ne doit pas être top pour ton cas ;-(
Donc, tu peux réduire le script à :
Affichage sur commande uniquement
:z
On pose une étiquette
/^$/{
Motif correspondant à une ligne vide avec regroupement de commande entre les accolades
p
On imprime
b
Et on se branche à la fin du script, autrement dit le reste des commandes ne sera pas évalué pour ce motif
}
Fin du regroupement de commandes
/) *;$/ {
Motif correspondant à une fin de ligne (le $ en fin) finissant par une parenthèse fermante suivie ou pas d'un espace suivi d'un point virgule.
s/\($[^ ]*[^=]*\)\( *=[^)]*) *;\)$/\1\2\n\1->execute();/
Les substitutions avec référence-arrière. J'ai juste modifié leur nombre et la façon de matcher les motifs.
\($[^ ]*[^=]*\)
On matche tout jusqu'à ce qu'on rencontre un espace ou un signe égale. Le "[^=]" exclue le signe égale de la recherche.
\( *=[^)]*) *;\)$
Idem avec la parenthèse fermante. On cherche un motif commençant ou pas par un espace suivi du signe égale jusqu'à ce qu'on rencontre une parenthèse fermante, qu'on capture en l'incluant dans la référence-arrière. Le "$" à la fin signifie qu'on cherche une fin de ligne.
p
Si correspondance il y a c'est affiché
b
Et on se branche à la fin du script
}
Fin du regroupement de commandes
/) *;$/ !{
Si la ligne ne correspond pas (! indique la négation) au motif
N
On ajoute la ligne suivante
b z
Et on se branche à l'étiquette pour boucler (le "p" était en trop dans mon exemple ;-( )
}
Fin du regroupement de commandes
Apparemment l'affichage sur commande ne doit pas être top pour ton cas ;-(
Donc, tu peux réduire le script à :
:z /^.*) *;$/ { s/\($[^ ]*[^=]*\)\( *=[^)]*) *;\)$/\1\2\n\1->execute();/ b } /) *;$/ !{ N b z }
zipe31
Messages postés
36402
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 420
19 juin 2012 à 19:24
19 juin 2012 à 19:24
Un zeste plus optimisé...
:z /^\n*$.*) *;$/ { s/\($[^ ]*[^=]*\)\( *=[^)]*) *;\)$/\1\2\n\1->execute();/ b } /) *;$/ !{ N b z }
radgeur
Messages postés
201
Date d'inscription
samedi 25 septembre 2010
Statut
Membre
Dernière intervention
20 juin 2012
27
20 juin 2012 à 10:36
20 juin 2012 à 10:36
Merci beaucoup, ton code fonctionne effectivement parfaitement, ne me reste plus qu'à le comprendre pour pouvoir le modifier si besoin est.
zipe31
Messages postés
36402
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 420
20 juin 2012 à 10:43
20 juin 2012 à 10:43