2014-02-20 16 views
5

Um String in der Zeichenfolge bash zu ersetzen str ich benutze:wie ersetzen "/" in einer POSIX sh String

str=${str/$pattern/$new} 

Allerdings bin ich derzeit ein Skript zu schreiben, die mit ash ausgeführt werden.

Ich habe eine Zeichenfolge, die '/' enthält, und ich möchte die obige Syntax verwenden, um die '/' in meinem String zu ersetzen, aber es funktioniert nicht.

Ich habe versucht:

str=${str///a} 
str=${str/\//a} 
str=${str/'/'/a} 

Aber sie funktionieren nicht

, wie ich das beheben kann?

Antwort

9

Diese Parametererweiterung ist eine Bash-Erweiterung zu POSIX sh. Wenn Sie the relevant section of IEEE standard 1003.1 überprüfen, werden Sie feststellen, dass dies kein erforderliches Feature ist. Shells, die nur die POSIX-Konformität versprechen, wie ash, sind nicht verpflichtet, sie zu implementieren, und müssen ihren Implementierungen keinen bestimmten Standard auferlegen Korrektheit sollten sie trotzdem ...

Wenn Sie Bash-Erweiterungen wollen, müssen Sie Bash (oder andere Ksh-Derivate, die ähnlich erweitert werden) verwenden.

In der Zwischenzeit können Sie andere Tools verwenden. Zum Beispiel:

str=$(printf '%s' "$str" | tr '/' 'a') 

oder

str=$(printf '%s' "$str" | sed -e '[email protected]/@[email protected]') 
+0

es auch für andere Zeichen arbeiten, aber nicht für ‚/‘ –

+0

@Anis_Stack Die POSIX-Shell-Sprache erfordert nicht es überhaupt zu arbeiten. Sehen Sie sich die Liste der Erweiterungen in http://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html an - Sie werden sehen, dass '$ {foo // bar/baz}' nicht auf der Liste steht . –

+0

@Anis_Stack ... und da 'ash' nur verspricht, mit POSIX sh kompatibel zu sein, und POSIX sh benötigt diese Funktion nicht, ist jede Implementierung, die nur halb gebacken ist, nicht einmal ein Fehler, es ist nur ein unspezifiziertes Verhalten. –