1408 Stimmen

Ersetzen Sie in einem Shell-Skript eine Teilzeichenfolge durch eine andere Zeichenfolge.

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"

2308voto

ruakh Punkte 167025

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".

362voto

Kevin Punkte 51067

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"

229voto

Roman Kazanovskyi Punkte 2901

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")

94voto

Kent Punkte 180747

Versuchen Sie dies:

 sed "s/Suzi/$secondString/g" <<<"$firstString"

70voto

Camilo Martin Punkte 35643

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.com

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.

Powered by:

X