wake-up-neo.com

Ersetzen einiger Zeichen in einer Zeichenfolge durch ein anderes Zeichen

Ich habe einen String wie AxxBCyyyDEFzzLMN und möchte alle Vorkommen von x, y und z durch ersetzen _.

Wie kann ich das erreichen?

Ich weiß, dass echo "$string" | tr 'x' '_' | tr 'y' '_' funktionieren würde, aber ich möchte das auf einmal tun, ohne Pipes zu verwenden.

245
Amarsh
echo "$string" | tr xyz _

würde jedes Vorkommen von x, y oder z durch _ ersetzen, was in Ihrem Beispiel A__BC___DEF__LMN ergibt.

echo "$string" | sed -r 's/[xyz]+/_/g'

wiederholte Vorkommen von x, y oder z werden durch einen einzelnen _ ersetzt, was in Ihrem Beispiel A_BC_DEF_LMN ergibt.

287
jkasnicki

Mit Bash Parameter Expansion :

orig="AxxBCyyyDEFzzLMN"
mod=${orig//[xyz]/_}
256

Möglicherweise finden Sie diesen Link hilfreich:

http://tldp.org/LDP/abs/html/string-manipulation.html

Im Allgemeinen,

So ersetzen Sie die erste Übereinstimmung von $ substring durch $ replacement:

${string/substring/replacement}

So ersetzen Sie alle Übereinstimmungen von $ substring durch $ replacement:

${string//substring/replacement}

BEARBEITEN: Beachten Sie, dass dies für eine Variable mit dem Namen $ string gilt.

91
Dylan Daniels
read filename ;
sed -i 's/letter/newletter/g' "$filename" #letter

^ Verwenden Sie so viele davon, wie Sie benötigen, und erstellen Sie Ihre eigene BASIC-Verschlüsselung

5
Michael

Hier ist eine Lösung mit Shell-Parametererweiterung, die mehrere aufeinander folgende Vorkommen durch ein einzelnes _ ersetzt:

$ var=AxxBCyyyDEFzzLMN
$ echo "${var//+([xyz])/_}"
A_BC_DEF_LMN

Beachten Sie, dass das Muster +(pattern) einen erweiterten Mustervergleich erfordert, der mit aktiviert wird

shopt -s extglob

Alternativ mit der Option -s ("Squeeze") von tr:

$ tr -s xyz _ <<< "$var"
A_BC_DEF_LMN
5
Benjamin W.