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.
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.
Mit Bash Parameter Expansion :
orig="AxxBCyyyDEFzzLMN"
mod=${orig//[xyz]/_}
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.
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
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