2016-05-31 26 views
2

Ich habe ein Skript, das ein paar Variablen enthält. Einer davon ist ein proprietärer Pfad MYPATH.
Ich möchte die Ausgabe von MYPATH speichern und dann eine andere Variable SOME_OTHER_PATH mit dem gleichen Wert ersetzen.sed: Ausgabe speichern und ersetzen

Aktuelle Eintrag in myfile.sh

MYPATH="/opt/local/custom/myfiles" 
SOME_OTHER_PATH="" 

Ausgabe, die ich

MYPATH="/opt/local/custom/myfiles" 
SOME_OTHER_PATH="/opt/local/custom/myfiles" 

Das Skript will, dass ich tue dies

mylocalpath=`sed -n /^MYPATH/p' myfile.sh | sed -e 's/MYPATH/'` 
sed -i -e "s/^SOME_OTHER_PATH/${mylocalpath}" myfile.sh 

Es gibt zwei Probleme geschrieben hier

  1. Seit ${mylocalpath} enthält „/“, sed versuchen, diese zu bewerten und löst eine Ausnahme
  2. Ich mag würde das gesamte Skript in einer sed-Datei (statt Laufe sed zweimal) und führen Sie es als

    bündeln
    sed -f sed_file myfile.sh 
    
+0

Für Problem # 1, siehe [diese Antwort in Bezug auf entweichende Zeichen für sed] (http://stackoverflow.com/:

Um eine "in-place" bearbeitet, nur eine temporäre Datei verwenden ausführen a/29613573/2877364) – cxw

Antwort

2

Während ich sicher bin, dass dies möglich ist mit sed, würde ich empfehlen, awk mit:

awk -F'"' '/^MYPATH=/ { path = $2 } /^SOME_OTHER_PATH=/ { $0 = $1 path "\"" } 1' file 

Speichern Sie den Pfad zu einer Variablen, wenn die Zeile mit MYPATH beginnt, und verwenden Sie sie, wenn die Zeile mit SOME_OTHER_PATH beginnt. Die 1 am Ende ist die kürzeste wahre Bedingung und { print } ist die Standardaktion, so dass jede Zeile gedruckt wird.

awk ... file > tmp && mv tmp file