Pourquoi le plus ne fonctionnera-t-il pas correctement avec cette commande sed?

Je ne parviens pas à faire fonctionner correctement la regex sed ([^/]+) .
Au lieu de renvoyer toutes les barres obliques, il n’en retourne qu’une.

Commander:

 echo '/test/path/file.log' | sed -r 's|^.*([^/]+)/(.*)$|\1.\2|g' 

Attendu:

 path.file.log 

Résultat:

 h.file.log 

Aussi essayé cela, mais a obtenu le même résultat:

 echo '/test/path/file.log' | sed -r 's|^.*([^/]{1,})/(.*)$|\1.\2|g' 

Le problème n’est pas avec [^/]+ , mais avec le précédent .* . .* est gourmand et consumra un maximum d’intrants. Ma suggestion habituelle serait d’utiliser .*? pour le rendre non gourmand, mais les expressions rationnelles POSIX ne supportent pas cette syntaxe.

S’il y a toujours une barre oblique, vous pouvez en append une au regex pour l’empêcher de consumr trop.

 $ echo '/test/path/file.log' | sed -r 's|^.*/([^/]+)/(.*)$|\1.\2|g' path.file.log 

Les systèmes d’exploitation utilisent différentes versions de sed . Certaines versions de sed utilisent par défaut la syntaxe de base de regexp; Si vous avez besoin d’une syntaxe d’expressions rationnelle étendue ( + est l’une de ces fonctionnalités), vous devez changer d’option avec -E .