tr und Regular Expressions

Jonas Schrieb lug-owl.de at schrieb.de
Sat Apr 3 10:35:59 CEST 2004


On Fri, Apr 02, 2004 at 06:50:45PM +0200, David Christopher Weichert wrote:
> wird noch merkwuerdiger:
> 
> mit tr -cd [a-z0-9_~+\-] kriege ich qu?u! => qu?u *und* qu\u => qu\u
> 
> mit tr -cd [a-z0-9_~+\\-] kriege ich Dasselbe qu?u! => qu?u *und* qu\u
> => qu\u
> 
> aber mit tr -cd [a-z0-9_~+\\\-] erhalte ich, was ich wollte qu?u! => quu
> *und* qu\u => quu
> 
> Kann mir das jemand erklaeren?

Vorab: bei mir kommen in Mails die Sondezeichen nicht richtig rueber.
Ich gehe davon aus, dass die Dateinamen quFRAGEZEICHENu und quBACKSLASHu
sind.


Also das, was du da oben schreibst (mit 3 Backslashes statt 2) finde ich
sehr verwunderlich und ich kann es auch nicht reproduzieren. Bei mir
klappt es mit 2 Backslashes wunderbar.

Die Bash ersetzt einige Sonderzeichen und so auch die Backslashes
(deshalb muss man dann ja "escapen"). Was genau passiert, kann man sich
durch folgendes Miniscript gut veranschaulichen:

test.sh
/-------
| #!/bin/sh
| echo -E $1
\-------

Es macht nichts weiter, als das erste Kommandozeilenargument auszugeben.
Die -E Option bei echo verhindert, dass echo selbst irgendwelche
\-Kombinationen ersetzt.

Nun kann man damit gut testen, was bei den Aufrufen passiert:

jonas at nr5:~$ ./test.sh [a-z0-9_~+-]
[a-z0-9_~+-]
jonas at nr5:~$ ./test.sh [a-z0-9_~+\-]
[a-z0-9_~+-]
jonas at nr5:~$ ./test.sh [a-z0-9_~+\\-]
[a-z0-9_~+\-]
jonas at nr5:~$ ./test.sh [a-z0-9_~+\\\-]
[a-z0-9_~+\-]
jonas at nr5:~$ ./test.sh [a-z0-9_~+\\\\-]
[a-z0-9_~+\\-]
jonas at nr5:~$ ./test.sh "[a-z0-9_~+\-]"
[a-z0-9_~+\-]

Man sieht also, dass es keinen Unterschied mit 2 oder 3 Backslashes
macht. Ausserdem sieht man, dass man sich mit den Anfuehrungszeichen
viel Aerger sparen kann. Daher sollte man RegExp auf der Kommandozeile
am besten immer in Anfuehrungszeichen setzen, ausser wenn die Shell sie
selbst interpretieren soll (z.B. bei Dateinamen mit Wildcards oder
aehnlichem). Der wesentliche Unterschied zwischen ' und " ist, dass bei
letzterem noch Variablen mit $ ausgewertet werden.

Warum das bei dir jetzt anders laeuft, weiss ich nicht. Also bei mir
sind es die Standardversionen von Debian unstable:

GNU bash, version 2.05b.0(1)-release (i386-pc-linux-gnu)
tr (coreutils) 5.0.91



Tschoe,
		Jonas



More information about the Linux mailing list