salut,

On Sat, Mar 01, 2025 at 09:02:20PM +0100, Bernard Schoenacker wrote:
> Bonjour,
> Merci beaucoup pour la réponse, attention c'est juste un exemple dans une 
> liste 
> <terme de matière> " espace "  <Qtité numérique> " espace" <unité g pour 
> grammes>

dans ton premier mail, le séparateur n'est pas un espace mais une
tabulation. si c'est le cas tout le temps alors le problème est simple:

<<% hd
Butter  500g

                            Ici c'est bien une tabulation
                            v
00000000  42 75 74 74 65 72 09 35  30 30 67 0a              |Butter.500g.|
0000000c

du coup:

<<% awk -F'\t' -vOFS='\t' '{t=$1;$1=$2;$2=t}1'
Butter  500g
Amour pour le format TSV        ∞

ou une version plus verbeuse

awk '
        BEGIN { FS = OFS = "\t" }
        {
                temp = $1
                $1   = $2
                $2   = temp
        }
        1 # toujours vrai donc fait toujours l'action par défaut ({print})
'

ou en perl si tu as de gros volumes (ce qui ne sera pas le cas pour une
recette):

<<% perl -plF'\t' -E '$_=join "\t", reverse @F'
Butter  500g
Amour pour le format TSV        ∞


> Merci beaucoup pour la réponse, attention c'est juste un exemple dans une 
> liste 
> <terme de matière> " espace "  <Qtité numérique> " espace" <unité g pour 
> grammes>

si tu dis vrai (on ne peut pa compter sur \t), faut prévoir les cas
pourris du genre


doliprane 1G 1 barquette
huile d'olive ½ louche

ma stratégie serait donc

        <produit> <ws>* <quantité> <ws>* <unité>

et donc considérer que <quantité est la dernière valeur numérique de la
ligne.


<<% perl -plE '/(.*) *(\d+|[½¾]) *(.*)/; $_="$2 $3\t$1"'
doliprane 1G 1 barquette
huile d'olive ½ louche

<<% sed -E 's/(.*) *([0-9]+|[½¾]) *(.*)/\2 \3\t\1/'
doliprane 1G 1 barquette
huile d'olive ½ louche

bonne soirée


-- 
Marc Chantreux
Pôle CESAR (Calcul et services avancés à la recherche)
Université de Strasbourg
14 rue René Descartes,
BP 80010, 67084 STRASBOURG CEDEX
03.68.85.60.79

Répondre à