8
votes

Breadreferences dans SED renvoyant une mauvaise valeur

J'essaie de remplacer une expression à l'aide de SED. La regex fonctionne dans Vim mais pas dans SED. Je remplace le dernier tiret avant le numéro avec une barre oblique si xxx

doit revenir xxx

J'utilise la commande suivante mais Garde la sortie / www / www / nom-nom / 0 à la place xxx

Qu'est-ce que je fais mal?


0 commentaires

3 Réponses :


0
votes

Il semble que SED sous OS X commence à compter des rafraîchies à 1. Essayez \ 1 au lieu de \ 0


3 commentaires

Si j'utilise \ 1, il retourne "\ 1 non défini dans le RE"


OS X / MacOS possède d'anciens outils UNIX. Vous ne pouvez pas utiliser -r ce qui signifie que vous devez échapper aux parenthèses.


OS X'S SED utilise -E -E au lieu de -r pour permettre une extension de regex



15
votes

Vous devez entourer entre parentent les données pour la référencer ultérieurement, et sed code> commence à compter dans 1. Pour récupérer tous les caractères correspondants sans la nécessité de parenthèses, il est utilisé le et code> symbole.

/www/file-name/1


2 commentaires

C'est la bonne réponse. Je n'ai pas remarqué @ user2052491 n'utilisait pas les parenthèses.


Les backslashes avant que les accolades ne soient pas nécessaires, sont-ils?



5
votes

Vous devez capturer à l'aide de parenthèses avant de pouvoir retourner référence (qui démarrez un \ 1 ) . Essayez sed -r 's | (. *) - | \ 1 / |' : xxx

Vous pouvez utiliser n'importe quel délimiteur avec SED SO / n'est pas le meilleur choix lorsque la substitution contient / . L'option -r est destinée à la REGEXP étendue de sorte que la parenthèse n'a pas besoin d'être échappée.


0 commentaires