Ich habe "Ich liebe Suzi und Marry" und möchte "Suzi" in "Sara" ändern.
firstString="Ich liebe Suzi und Marry"
secondString="Sara"
Gewünschtes Ergebnis:
firstString="Ich liebe Sara und Marry"
Ich habe "Ich liebe Suzi und Marry" und möchte "Suzi" in "Sara" ändern.
firstString="Ich liebe Suzi und Marry"
secondString="Sara"
Gewünschtes Ergebnis:
firstString="Ich liebe Sara und Marry"
Um das erste Auftreten eines Musters durch eine gegebene Zeichenfolge zu ersetzen, verwenden Sie ${_parameter_/_pattern_/_string_}
:
#!/bin/bash
firstString="Ich liebe Suzi und Marry"
secondString="Sara"
echo "${firstString/Suzi/"$secondString"}"
# gibt 'Ich liebe Sara und Marry' aus
Um alle Vorkommen zu ersetzen, verwenden Sie ${_parameter_//_pattern_/_string_}
:
Nachricht='Der geheime Code ist 12345'
echo "${message//[0-9]/X}"
# gibt 'Der geheime Code ist XXXXX' aus
(Dies ist im Bash-Referenzhandbuch dokumentiert, Abschnitt 3.5.3 "Shell-Parameter-Erweiterung".)
Beachten Sie, dass dieses Feature nicht von POSIX spezifiziert ist — es ist eine Bash-Erweiterung — daher implementieren nicht alle Unix-Shell dieses. Für die relevanten POSIX-Dokumentationen siehe The Open Group Technical Standard Base Specifications, Issue 7, den Band Shell & Utilities, Abschnitt 2.6.2 "Parameter-Erweiterung".
Dies kann vollständig mit der Bash-String-Manipulation durchgeführt werden:
first="Ich liebe Suzy und Mary"
second="Sara"
first=${first/Suzy/$second}
Dies ersetzt nur das erste Vorkommen; um sie alle zu ersetzen, verdoppeln Sie den ersten Schrägstrich:
first="Suzy, Suzy, Suzy"
second="Sara"
first=${first//Suzy/$second}
# first ist jetzt "Sara, Sara, Sara"
Für Dash funktionieren alle vorherigen Beiträge nicht
Die POSIX sh
kompatible Lösung ist:
result=$(echo "$firstString" | sed "s/Suzi/$secondString/")
Dies wird das erste Vorkommen in jeder Eingabezeile ersetzen. Fügen Sie eine /g
Flagge hinzu, um alle Vorkommen zu ersetzen:
result=$(echo "$firstString" | sed "s/Suzi/$secondString/g")
Es ist besser, Bash zu verwenden als sed
, wenn Zeichenfolgen reguläre Ausdruckszeichen enthalten.
echo ${first_string/Suzi/$second_string}
Es ist portabel für Windows und funktioniert mindestens so gut wie Bash 3.1.
Um zu zeigen, dass Sie sich nicht allzu sehr um das Escaping kümmern müssen, lassen Sie uns das hier ändern:
/home/name/foo/bar
Zu diesem:
~/foo/bar
Aber nur wenn /home/name
am Anfang steht. Wir brauchen kein sed
!
Angelehnt an die magischen Variablen von Bash $PWD
und $HOME
können wir:
echo "${PWD/#$HOME/\~}"
Danke an Mark Haferkamp in den Kommentaren für den Hinweis zum Zitieren/Escape von ~
.*
Beachten Sie, dass die Variable $HOME
Schrägstriche enthält, aber das hat nichts kaputt gemacht.
Weitere Informationen: Advanced Bash-Scripting Guide.
Wenn die Verwendung von sed
ein Muss ist, stellen Sie sicher, dass Sie jedes Zeichen escapen.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.