2016-09-05 4 views
2

Ich habe ein Bash-Skript, das ich mehrere Repos ziehen, um eine neue Instanz unseres Projektarbeitsablaufs zu erstellen, die eine Reihe von String-Ersetzungen basierend auf Informationen von der Befehlszeile ausgeführt ausführt .Bash-Skript sed Verwendung verursacht Probleme in ZSH

Ein Kollege verwendet ZSH und es traten Probleme auf, die durch die Verwendung von sed im Skript verursacht wurden. Insbesondere scheint es, dass es die Regex nicht verarbeitet? Zum Beispiel ...

# Author Name. 
    if [[ $authorname ]] 
    then 
    sed -i "" "s/Author Name/$authorname/g" "$file" 
    fi 

Resultierende in dem folgenden Fehler:

sed: can't read "s/Author Name/$authorname/g" : No such file or directory 

Wir haben festgestellt, dass durch das Hinzufügen der -e Flagge der Mehrheit der String Ersatz Fehler weggeht, aber er bekommt immer noch eine Anzahl der Fehler ‚nicht gefunden‘ ...

sed: can't read : No such file or directory 

gibt es einen besseren Weg, um die Zeichenfolge Ersatz durchzuführen, die beide Bash und ZSH freundlich ist?

Antwort

1

Vermutlich verwenden Sie GNU sed, die nicht -i "" wie Muster zum Bearbeiten der Datei an Ort und Stelle wie BSD sed dauert.

Von man sed:

-i[SUFFIX], --in-place[=SUFFIX]

Sie müssen den Raum entfernen zwischen:

sed -i"" "s/Author Name/$authorname/g" "$file" 

Oder wie Sie jede Sicherung nicht nehmen, einfach tun:

sed -i "s/Author Name/$authorname/g" "$file" 
+0

Dies wird fail on * BSD, obwohl. Es gibt keine wirklich portable Möglichkeit, '-i' plattformübergreifend zu verwenden. – tripleee

+0

Außerdem ist "sed -i" "..." genau * äquivalent zu "sed -i ...". '-i" "', nach Zitatentfernung, ist das gleiche Wort wie '-i'. – chepner

1

wenn Sie das tun:

sed -i "" "s/Author Name/$authorname/g" "$file" 

Erstes Argument "" als regex betrachtet, und die anderen als die Dateien, damit der Fehler Sie bekommen.

Entfernen Sie einfach die "" Ihrer Befehlszeile.

Alternativ kann, wenn die Befehle dynamisch sind Sie tun können:

sed -i -e "" -e "s/Author Name/$authorname/g" "$file" 

erste Regex ignoriert.