Escape-String-Eingabe nach sed

0

Ich habe einige Probleme beim Ersetzen einer Zeichenfolge in einer Datei mithilfe von sed durch eine Zeichenfolge mit Zeilenumbrüchen. Das Folgende wird vollständig fehlschlagen. Ich gehe davon aus, dass ich mich von der Zeichenfolge replace_with lösen muss, aber ich kann nicht herausfinden, wie oder ob dies der beste Weg ist, dies zu tun. Jede Hilfe wäre dankbar

REPLACE_WITH="Blah
 de
 blah."

sed -i "s/TO_REPLACE/$REPLACE_WITH/g" file
David Davies-Jones
quelle

Antworten:

0

Dies erfordert eine "doppelte Flucht", aber die Fluchtzeichen müssen zum Befehl "s" des Sed gelangen, damit sie auch aus der Bash-Shell entkommen können. ("Triple Flucht"?)

REPLACE_WITH="Blah\\
de\\
blah."

sed -i "s/TO_REPLACE/$REPLACE_WITH/g" file

Bash decodiert das "\\" in ein einzelnes "\" und fügt ein einzelnes '\' in den send-Befehl ein, den der sed-Befehl dann als '\ {newline}' interpretiert der Befehl.

Wenn Sie nur ein '\' am Ende jeder Zeile hätten, würde Bash das '\ {newline}' sehen, das als 'nichts' interpretiert wird, dh: die Zeilenumbrüche und der Backslash werden vollständig entfernt.

Grundregel für bash-sed-awk ... wenn Ihre Backslashes nicht funktionieren, versuchen Sie sie zu verdoppeln ... noch einmal.

user3710044
quelle
Leider führt dies zu folgendem Ergebnis, sobald sed ausgeführt wurde (natürlich mit den richtigen Zeilenumbrüchen) - REPLACE_WITH = "Blah \ de \ blah".
David Davies-Jones
Ja tut es; Die umgekehrten Schrägstriche in der Zeichenfolge sind erforderlich, um im sed-Skript einen mehrzeiligen s /// -Befehl zu erstellen. Wenn Sie eine einfache Zeichenfolge in eine ausreichend zitierte Zeichenfolge umwandeln möchten, um die "Datei" zu ändern, benötigen Sie wahrscheinlich einen zusätzlichen sed-Befehl ... ist es das, was Sie suchen?
user3710044
Ich habe gerade festgestellt, dass ich das falsche Skript getestet habe. Werde es jetzt nochmal versuchen sorry :(
David Davies-Jones
Endlich kam es zum Testen mit dem richtigen Skript, und es funktioniert danke :)
David Davies-Jones