Ich verwende den folgenden Code zum Ersetzen einer Zeichenfolge in einem Shell-Skript.
echo $LINE | sed -e 's/12345678/"$replace"/g'
Es wird jedoch durch $replace
anstelle des Werts dieser Variablen ersetzt.
Kann jemand sagen, was schief gelaufen ist?
Antworten:
Wenn Sie interpretieren möchten
$replace
, sollten Sie keine einfachen Anführungszeichen verwenden, da diese das Ersetzen von Variablen verhindern.Versuchen:
Angenommen, Sie möchten die Anführungszeichen eingeben. Wenn Sie die Anführungszeichen nicht möchten, verwenden Sie:
Transkript:
Achten Sie nur darauf, dass
${replace}
keine Zeichen von Bedeutung sindsed
(wie/
zum Beispiel), da dies zu Verwirrung führen kann, wenn Sie nicht entkommen. Aber wenn Sie, wie Sie sagen, eine Nummer durch eine andere ersetzen, sollte das kein Problem sein.quelle
set
ist auch nicht nötig (und wie wolltest du es überhaupt benutzen?). Einfachreplace=987654321
.export
um sicherzustellen, dass Variablen für Kinder festgelegt sind, aber wie Sie sagen, können Sie dies genauso gut vermeiden. Die Verwendung oder Nichtverwendung vonexport
ist hier jedoch irrelevant (ein Stilproblem) und hat keine Auswirkung auf die tatsächliche Antwort, dh wie Variablen innerhalb einessed
Befehls verwendet werden.-i
Option nicht zu funktionieren . Würdest du wissen warum? oder wie soll es funktionieren?$
oder`
imsed
Skript mit einem Backslash maskiert werden muss, um es vor dem Substitutionsmechanismus der Shell für Zeichenfolgen in doppelten Anführungszeichen zu schützen.Sie können die Shell (bash / ksh) verwenden.
quelle
/bin/sh
Beachten Sie, dass dies auch bei Dash fehlschlägt, was bei vielen modernen Linuxes der Fall ist.Nicht spezifisch für die Frage, aber für Leute, die die gleiche Funktionalität benötigen, die aus Gründen der Klarheit gegenüber früheren Antworten erweitert wurde:
quelle
Einfache Anführungszeichen sind sehr stark. Sobald Sie drinnen sind, können Sie nichts mehr tun, um die Variablensubstitution aufzurufen, bis Sie gehen. Verwenden Sie stattdessen doppelte Anführungszeichen:
quelle
Eine anmutige Lösung gefunden .
quelle
Sie können weiterhin einfache Anführungszeichen verwenden, müssen diese jedoch "öffnen", wenn die Variable an der richtigen Stelle erweitert werden soll. Andernfalls wird die Zeichenfolge "wörtlich" genommen (wie @paxdiablo richtig angegeben hat, ist auch seine Antwort richtig).
quelle
$replace
außerhalb von Anführungszeichen dazu führt, dass die Shell eine Whitespace-Tokenisierung und eine Platzhaltererweiterung für den Wert durchführt. Dies scheint mit einfachen Werten zu funktionieren, kann jedoch bei nicht trivialen Zeichenfolgen dramatisch explodieren. Verwenden Sie dies nicht im Produktionscode.Damit Ihre Shell die Variable erweitern kann, müssen Sie doppelte Anführungszeichen wie verwenden
Dies wird unterbrochen, wenn
$replace
Sonderzeichensed
(#
,\
) enthalten sind. Sie können sie jedoch vorverarbeiten$replace
, um sie zu zitieren:quelle
Ich hatte eine ähnliche Anforderung, aber mein Ersatz-Var enthielt ein kaufmännisches Und. Wenn ich dem kaufmännischen Und so entkommen konnte, löste sich mein Problem:
quelle
Verwenden Sie dies stattdessen
Das funktioniert bei mir einfach die Anführungszeichen entfernen
quelle
Ich bevorzuge doppelte Anführungszeichen, da einfache Quptes sehr mächtig sind, da wir sie verwenden, wenn sie nichts darin ändern oder die variable Substitution aufrufen können.
Verwenden Sie daher doppelte Anführungszeichen.
quelle