2016-05-12 13 views
4

Ich habe eine SQL-Datei (samplesqlfile) und ich möchte eine Zeichenfolge ersetzen, die Backticks mit einer anderen Zeichenfolge enthält. Unten ist der Code.Unix-Shell ersetzt ein Wort mit Backtick in einer Datei

actualtext="FROM sampledatabase.\`Datatype\`" 
replacetext="FROM sampledatabase.\`Datatype_details\`" 
sed -i "s/\<${actualtext}\>/${replacetext}/g" samplesqlfile 

Dies funktioniert nicht. Das eigentliche zu ersetzende Wort ist

Ich fügte zurück Schrägstriche, um den Backticks zu entkommen. Aber es funktioniert immer noch nicht. Bitte helfen Sie.

Antwort

3

Beachten Sie, dass dies nicht funktioniert:

$ sed "s/\<${actualtext}\>/${replacetext}/g" samplesqlfile 
FROM sampledatabase.`Datatype` 

Aber das tut:

$ sed "s/\<${actualtext}/${replacetext}/g" samplesqlfile 
FROM sampledatabase.`Datatype_details` 

Das Problem war die \>. Die Stringvariable $actualtext endet nicht mit einem Wortzeichen. Es endet mit einem Zitat. Folglich wird \> dort nie übereinstimmen. Die Lösung ist \> zu entfernen.

Um zu klären, \> passt an der Grenze zwischen einem Wort Zeichen und einem Nicht-Wort-Zeichen, wo das Wort Zeichen zuerst erscheint. Wortzeichen können alphanumerische Zeichen oder Unterstriche sein.

\> ist eine GNU-Erweiterung. Das Verhalten unter BSD/OSX sed wird anders sein.

Zum Zwecke der Veranschaulichung habe ich die Option -i entfernt. Für den beabsichtigten Gebrauch, natürlich, fügen Sie es zurück.

+1

Ja ... das war das Problem. Du hast meine Zeit gerettet ... danke oder so. – user2349253

Verwandte Themen