¿Qué significa reemplazar barras (/) por signos de exclamación (!) En un comando sustituto?

13

Hace poco vi un comando sustituto donde el autor tenía el /reemplazado por uno !como este::s!abc!ABC!g

Traté de encontrar documentación sobre este uso, pero no pude encontrar nada relevante. Así que intenté experimentar solo y una vez más no pude descubrir la diferencia real entre los dos signos. Esto es lo que encontré:

  • No es posible mezclar !y /en un comando. Por ejemplo :s!abc/ABCfalla.
  • Puede ser útil usar !para evitar escapar /de un patrón. Por ejemplo, si quiero reemplazar </con %puedo usar en :%s!</!%!glugar de :%s/<\//%/g.
  • Parece que, en algunos casos, algunas expresiones regulares no funcionarán /y funcionarán correctamente, !pero como no soy realmente un experto en expresiones regulares, no estoy seguro de eso.

Entonces mi pregunta es simple: ¿Cuál es la ventaja de usar !un comando sustituto y cuándo debería decidir usarlo en lugar de /?

statox
fuente
Esta pregunta también
Martin Tournoij
De hecho, hice una doble publicación por error. La marqué hace unos minutos para saber qué debía hacer.
statox

Respuestas:

22

De :help :global:

En lugar de '/' que rodea al {pattern}, puede usar cualquier otro carácter de byte único, pero no un carácter alfabético, '\', '"' o '|'. Esto es útil si desea incluir un '/' en el patrón de búsqueda o la cadena de reemplazo.

Como ya ideó a partir de su experimentación, esto es para prevenir el llamado " síndrome del palillo inclinado ". Considera esto:

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

versus:

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

La segunda forma es obviamente mucho más legible.

Esta es la única razón por la que puede cambiar el delimitador; para que sea más legible para nosotros los humanos. A la computadora no le importa.

Por cierto, algunos otros programas son aún más flexibles, sedpor ejemplo , en GNU puede usarlo xcomo delimitador si lo desea. sed sxaxbxg filees el mismo que sed s/a/b/g file.

Martin Tournoij
fuente
En cuanto a la legibilidad, prefiero (y sugiero) :%s@/home/martin/test@/home/jake/x@, ya que la "grasa" @hace que sea aún más fácil ver dónde comienzan / terminan las partes individuales de la declaración.
DevSolar
@DevSolar encontré que :%s#/home/martin/test#/home/jake/x#funciona aún mejor, pero eso es solo una opinión personal.
Amit Gold el