Que signifie remplacer les barres obliques (/) par des points d'exclamation (!) Dans une commande de substitution?

13

J'ai récemment vu une commande de remplacement où l'auteur a été /remplacé par un !comme ceci::s!abc!ABC!g

J'ai essayé de trouver de la documentation sur cette utilisation mais je n'ai rien trouvé de pertinent. J'ai donc essayé d'expérimenter par moi-même et encore une fois je n'ai pas pu comprendre la vraie différence entre les deux signes. Voici ce que j'ai trouvé:

  • Il n'est pas possible de mélanger !et /dans une commande. Par exemple :s!abc/ABCéchoue.
  • Il peut être utile de l'utiliser !pour éviter de s'échapper d'un /dans un modèle. Par exemple, si je veux remplacer </par %je peux utiliser à la :%s!</!%!gplace de :%s/<\//%/g.
  • Il semble que dans certains cas, certaines expressions rationnelles ne fonctionneront pas /et fonctionnent correctement, !mais comme je ne suis pas vraiment un expert en expressions régulières, je n'en suis pas sûr.

Ma question est donc simple: quel est l'avantage d'utiliser !une commande de substitution et quand dois-je décider de l'utiliser à la place de /?

statox
la source
Cette question a également
Martin Tournoij
En effet j'ai fait un double post par erreur je l'ai signalé il y a quelques minutes pour savoir ce que je devais faire.
statox

Réponses:

22

De :help :global:

Au lieu du '/' qui entoure le {pattern}, vous pouvez utiliser n'importe quel autre caractère à un octet, mais pas un caractère alphabétique, '\', '"' ou '|'. Ceci est utile si vous souhaitez inclure un '/' dans le modèle de recherche ou la chaîne de remplacement.

Comme vous l'avez déjà imaginé à partir de votre expérimentation, il s'agit de prévenir ce que l'on appelle le " syndrome du cure-dent penché ". Considère ceci:

:%s/\/home\/martin\/test/\/home\/jake\/x/

contre:

:%s!/home/martin/test!/home/jake/x!

La deuxième forme est évidemment beaucoup plus lisible.

C'est la seule raison pour laquelle vous pouvez modifier le délimiteur; pour le rendre plus lisible pour nous les humains. L'ordinateur s'en fiche.

D'ailleurs, certains autres programmes sont encore plus flexibles, dans GNU sedpar exemple, vous pouvez utiliser xcomme délimiteur si vous le souhaitez. sed sxaxbxg fileest le même que sed s/a/b/g file.

Martin Tournoij
la source
En ce qui concerne la lisibilité, je préfère (et suggère) :%s@/home/martin/test@/home/jake/x@, car le "gras" @permet encore plus facilement de voir où les différentes parties de la déclaration commencent / se terminent.
DevSolar
@DevSolar J'ai trouvé les :%s#/home/martin/test#/home/jake/x#travaux encore meilleurs, mais ce n'est qu'une opinion personnelle.
Amit Gold