2017-06-07 3 views
0

J'essaie de configurer un filtre dans mon fichier .gitconfig qui remplace une chaîne incluant des antislashs avec une autre chaîne, y compris les barres obliques inverses.Echappement de barre oblique inverse dans .gitconfig

clean = sed 's|foo|bar|g' 
smudge = sed 's|foo|bar|g' 

Cet exemple fonctionne, aussi longtemps que foo et bar ne comprennent pas \. Je suis conscient, que je devrais échapper à \, mais je ne peux tout simplement pas le faire fonctionner correctement. Est-ce que quelqu'un pourrait me dire comment cela fonctionne?

Répondre

0

En général, pour éviter un backslash, doublez-le. Si \x devient x, alors \\ devient \. Cette interprétation de barre oblique inversée "mange" les barres obliques inverses, mais pas si elles sont préfixées par une barre oblique inverse. Cela passe à côté de Git, où le shell le mange (interprète le backslash suivi d'un autre caractère comme spécial), donc si cette commande est envoyée à un shell, doublez-la à nouveau. Maintenant, un backslash dans le résultat final est représenté par quatre dans l'entrée.

Si le shell le passe à une commande telle que sed qui traite spécialement le backslash, doublez-le à nouveau. Maintenant, un backslash est huit!

Si cette commande passe la chaîne à une autre commande qui effectue une contre-oblitération, vous devrez la doubler à nouveau, et ainsi de suite. Pour cette raison, nous avons d'autres mécanismes de citation dans le shell (et dans d'autres langages): à l'intérieur des guillemets simples, la barre oblique inverse n'est plus spéciale, donc vous pouvez diviser par deux le nombre de barres obliques inversées. (Comparez avec, par exemple, des chaînes «brutes» en Python.) Pour ce cas particulier, cependant, huit barres obliques inverses ne sont probablement pas bien pire que des guillemets simples prudents et quatre antislashs.

+0

Cette explication approfondie a fait l'affaire. Merci beaucoup, je l'ai eu le travail! – DavidS