Ich habe eine Zeichenfolge 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' '_'
das funktionieren würde, aber ich möchte das auf einmal tun, ohne Rohre zu verwenden.
AxyzB
? Drei Unterstriche oder einer?tr '[xyz]'
wird ersetzen[
und]
auch. Das Argument sollte einfach eine Liste von Zeichen sein (obwohl Bereiche wiea-z
in Ordnung sind und in einigen Implementierungen POSIX-Zeichenklassen wie[:digit:]
).Antworten:
ersetzen würde jedes Auftreten
x
,y
oderz
mit_
, wasA__BC___DEF__LMN
in Ihrem Beispiel.ersetzen würde sich wiederholende Vorkommen
x
,y
oderz
mit einem einzigen_
, wasA_BC_DEF_LMN
in Ihrem Beispiel.quelle
,[]{}()~
Zeichen enthält . Ich möchte es durch jedes Sonderzeichen ersetzen, das entkommen ist.'\'
Wie kann ich dies durch einen Schuss erreichen?gsed
Binärdatei verwenden:$ brew install gnu-sed
then$ gsed -r 's/[xyz]+/_/g'
sed -E
entspricht dies (im Grunde)sed -r
vielen Linux-Distributionen. Wenn Sie es verwendensed 's/[xyz][xyz]*/_/g'
, benötigen Sie die Option nicht. Dies ist natürlich gleichbedeutend damit,tr -s xyz _
dass hier kein wirklicher Bedarf bestehtsed
.tr
.sed 's/[][{}()~,]/\\&/g'
Aber wirklich, stellen Sie eine neue Frage, wenn Sie eine Folgefrage haben (zögern Sie nicht, hier als Referenz zurück zu verlinken). Übrigens,
und~
sind keine Regex-Metazeichen (obwohl~
sie$HOME
in einigen Positionen von Bash und einigen anderen Shells erweitert werden;sh
jedoch nicht ).Verwenden der Bash-Parametererweiterung :
quelle
bash
. Andere Muscheln funktionieren möglicherweise nicht (obwohl einige dies tun).sed
wenn bash eine integrierte Substitution hat?Dieser Link könnte hilfreich sein:
http://tldp.org/LDP/abs/html/string-manipulation.html
Allgemein,
So ersetzen Sie die erste Übereinstimmung von $ substring durch $ replace:
So ersetzen Sie alle Übereinstimmungen von $ substring durch $ replace:
BEARBEITEN: Beachten Sie, dass dies für eine Variable mit dem Namen $ string gilt.
quelle
^ Verwenden Sie so viele davon, wie Sie benötigen, und Sie können Ihre eigene BASIC-Verschlüsselung erstellen
quelle
Hier ist eine Lösung mit Shell-Parametererweiterung, die mehrere zusammenhängende Vorkommen durch ein einziges ersetzt
_
:Beachten Sie, dass für das Muster ein erweiterter Mustervergleich erforderlich ist, der mit aktiviert ist
+(pattern)
Alternativ mit der
-s
Option ("Squeeze") vontr
:quelle