Ich will das tun:
cat update_via_sed.sh | sed 's/old_name/new_name/' > new_update_via_sed.sh
in meinem Programm.
Ich möchte aber Variablen verwenden, z
old_run='old_name_952'
new_run='old_name_953'
Ich habe versucht, sie zu verwenden, aber die Ersetzung findet nicht statt (kein Fehler). Ich habe versucht:
cat update_via_sed.sh | sed 's/old_run/new_run/'
cat update_via_sed.sh | sed 's/$old_run/$new_run/'
cat update_via_sed.sh | sed 's/${old_run}/${new_run}/'
Antworten:
Du könntest es tun:
Aber Vorsicht , dass
$old_run
würde als regulärer Ausdruck genommen werden und so alle Sonderzeichen , die die Variable enthält, wie zum Beispiel/
oder.
müßten entwertet werden . In ähnlicher Weise müssten$new_run
die Zeichen&
und\
speziell behandelt werden, und Sie müssten die/
Zeichen und die Zeilenumbrüche in diesen Zeichen umgehen.Wenn der Inhalt von
$old_run
oder$new_run
nicht unter Ihrer Kontrolle steht, ist es wichtig, dass dieser Code ausgeblendet wird .quelle
sed
allein nicht Regex verwenden wird, abersed -E
würde?-e
ist ein angebensed
e xpression , so dass Sie mehr als eine (wie in Passsed -e exp1 -e exp2
) oder Kombinationen von Dateien und Ausdrücke (sed -f file -e exp
).-E
Bei einigen Implementierungen kann es verwirrend sein , dass sed EREs anstelle von BREs verwendet.-E
ich nur die erweiterte Regex beherrsche, nicht die reguläre. Danke für die Erklärung.sed
Implementierungen für noch regulärere Ausdruckssyntaxen unterstützt werden.Das hat funktioniert:
Da ich dieselbe Datei "wiederverwenden" möchte, verwende ich diese Option für alle, die einen ähnlichen Ansatz wünschen:
Die oben erstellte neue Datei löscht dann die aktuelle Datei und benennt die neue Datei in die aktuelle Datei um.
quelle
sed -i s/"$old"/"$new"/ update_via_sed.sh
. Beachten Sie jedoch, dass dies bei keinem Wert von Alt und Neu funktioniert. zB darf es nicht / etc. enthalten, da $ old immer noch eine Suche ist und $ new ein Ersetzungsmuster, bei dem einige Zeichen spezielle Bedeutungen haben.sed -i "s/$old/$new/"
ist auch in Ordnung (mit den oben genannten Vorsichtsmaßnahmen).sed
Betrachtet das Trennzeichen normalerweise als das erste Zeichen nach dems
Befehl - dh wenn Ihre Variablen Schrägstriche enthalten,/
aber nicht mit at (@
) angegeben werden, können Sie "s @ $ old @ $ new @" verwenden.Sie können Variablen in sed verwenden, solange sie in doppelten Anführungszeichen stehen (nicht in einfachen Anführungszeichen):
Wenn
/
die Variable einen Schrägstrich ( ) enthält, verwenden Sie ein anderes Trennzeichen wie untenquelle
|
wie in meinem Fall, enthalten die Variablen einen Pfad so hat es/
darin|
funktionierte die Pipe für mich unter MacOS 10.14, aber andere Separatoren mögen@
oder#
nicht. Ich hatte auch Schrägstriche in meiner Umgebung."in-place" sed (mit der -i Flagge) war die Antwort. Danke an peterph.
quelle
s@
(was in keiner Weise speziell für die Shell ist). Am besten setzen Sie alles in Anführungszeichen wiesed -i "s@$old@$new@" file
. Beachten Sie, dass dies-i
keine Standardoption istsed
.$
in diesem Befehl entkommen . Ich werde$xxx
als Ganzes den Wert einer Variablen ändern$JAVA_HOME
. Ich habe versuchtsed -i "s@\$xxx@$JAVA_HOME@" file
, aber Fehler sagtno previous regular expression
man bash
gibt dies über einfache AnführungszeichenWas auch immer Sie in der Befehlszeile eingeben, die Bash interpretiert es und sendet dann das Ergebnis an das Programm, an das es gesendet werden soll. In diesem Fall erkennt die
sed 's/$old_run/$new_run/'
Bash zuerst dassed
als ausführbare Datei in der$PATH
Variablen . Diesed
ausführbare Datei erfordert eine Eingabe. Bash sucht nach der Eingabe und findet's/$old_run/$new_run/'
. Einfache Anführungszeichen sagen, dass Bash den Inhalt in ihnen nicht interpretiert und sie so weitergibt, wie sie sind. Bash übergibt sie dann an sed. Sed gibt einen Fehler aus, da dieser$
nur am Zeilenende auftreten kann.Wenn wir stattdessen doppelte Anführungszeichen verwenden, wird dies von
"s/$old_run/$new_run/"
bash$old_run
als Variablenname interpretiert und ersetzt (diese Phase wird als Variablenerweiterung bezeichnet). Dies ist in der Tat das, was wir benötigten.Sie müssen jedoch vorsichtig sein, wenn Sie doppelte Anführungszeichen verwenden, da diese zuerst von bash interpretiert und dann sed übergeben werden. Daher müssen einige Symbole wie `vor der Verwendung maskiert werden.
quelle
Bei Gefahr, frivol - haben Sie darüber nachgedacht
perl
.Was - unter anderem - ziemlich gut darin ist, Operationen im Sed-Style auszuführen, aber auch ein vollwertigeres Programmier-Dummy.
Es sieht so aus, als ob Sie in Ihrem Beispiel tatsächlich versuchen, eine Zahl zu erhöhen.
Wie wäre es also mit:
oder als Einzeiler:
quelle
In
$d1
speichere ich WerteIch kann den Wert aus der Variablen nicht ersetzen, daher habe ich den folgenden Befehl ausprobiert, der funktioniert
fehlendes doppeltes Anführungszeichen in
"${d1}"
, das war der Fehlerquelle
Vorausgesetzt
$old_run
und$new_run
bereits gesetzt:Dies zeigt die Änderung auf dem Bildschirm. Sie können die Ausgabe bei Bedarf in eine Datei umleiten.
quelle
Um eine Variable in sed zu verwenden, verwenden Sie doppelte Anführungszeichen "", um die Variable in das von Ihnen verwendete Muster einzuschließen. Zum Beispiel: a = "Hi" Wenn Sie die Variable 'a' an ein Muster anhängen möchten, können Sie Folgendes verwenden: sed -n "1, / pattern" $ {a} "pattern / p" filename
quelle
$a
ist hier nicht in Anführungszeichen gesetzt, was bedeutet, dass Leerzeichen in ihrem Wert die Wortteilung in der Shell auslösen.Sie können auch Perl verwenden:
quelle
""
) bewirken nichts.reiße die Saite
bad => linux sehe einen string $ old_run:
gut => Linux sehe eine Variable $ old_run:
quelle
$old_run
oder$new_run
enthält Leerzeichen?