Was bedeutet es, Schrägstriche (/) durch Ausrufezeichen (!) In einem Ersatzbefehl zu ersetzen?

13

Ich habe kürzlich einen Ersatzbefehl gesehen, bei dem der Autor den /durch einen !solchen ersetzt hat::s!abc!ABC!g

Ich habe versucht, eine Dokumentation zu dieser Verwendung zu finden, aber ich konnte nichts Relevantes finden. Also habe ich versucht, selbst zu experimentieren und konnte den wirklichen Unterschied zwischen den beiden Zeichen wieder nicht herausfinden. Folgendes habe ich gefunden:

  • Es ist nicht möglich, !und /in einem Befehl zu mischen . Zum Beispiel :s!abc/ABCscheitert.
  • Es kann nützlich sein !, a /in einem Muster nicht zu maskieren. Zum Beispiel , wenn ich will ersetzen </mit %mir verwenden kann , :%s!</!%!gstatt :%s/<\//%/g.
  • Es scheint, dass in einigen Fällen einige Regex nicht /richtig funktionieren, !aber da ich kein Regex-Experte bin, bin ich mir dessen nicht sicher.

Meine Frage ist also einfach: Was ist der Vorteil der Verwendung !in einem Ersatzbefehl und wann sollte ich mich dafür entscheiden, ihn anstelle von zu verwenden /?

statox
quelle
Diese Frage wurde auch für Stack Overflow
Martin Tournoij
In der Tat habe ich versehentlich einen doppelten Beitrag verfasst, den ich vor ein paar Minuten markiert habe, um zu wissen, was ich tun soll.
statox

Antworten:

22

Von :help :global:

Anstelle des '/', das das umgibt {pattern}, können Sie ein beliebiges anderes Einzelbytezeichen verwenden, jedoch kein alphabetisches Zeichen, '\', '"' oder '|'. Dies ist nützlich, wenn Sie ein '/' in einschließen möchten das Suchmuster oder die Ersetzungszeichenfolge.

Wie Sie bereits aus Ihren Experimenten ersehen haben, soll damit das sogenannte " Leaning-Toothpick-Syndrom " verhindert werden. Bedenken Sie:

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

gegen:

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

Die zweite Form ist offensichtlich viel besser lesbar.

Dies ist der einzige Grund, warum Sie das Trennzeichen ändern können. um es für uns Menschen lesbarer zu machen. Dem Computer ist das egal.

Einige andere Programme sind übrigens noch flexibler, in GNU können Sie sedzum Beispiel xals Trennzeichen verwenden, wenn Sie möchten. sed sxaxbxg fileist das gleiche wie sed s/a/b/g file.

Martin Tournoij
quelle
Was die Lesbarkeit angeht, bevorzuge ich (und schlage vor) :%s@/home/martin/test@/home/jake/x@, da das "Fett" @es noch einfacher macht, zu erkennen, wo die einzelnen Teile der Anweisung beginnen / enden.
DevSolar
@ DevSolar fand ich :%s#/home/martin/test#/home/jake/x#funktioniert noch besser, aber das ist nur persönliche Meinung.
Amit Gold