Potresti usare sed:
sed -i 's/MyCar on/MyCar off/' path/to/file
Puoi farlo solo con la shell. Questo esempio utilizza un'istruzione case non necessaria per questo particolare esempio, ma l'ho inclusa per mostrare come è possibile incorporare più sostituzioni. Sebbene il codice sia più grande di un sed 1-liner, in genere è molto più veloce poiché utilizza solo i built-in della shell (fino a 20x per i file di piccole dimensioni).
REPLACEOLD="old"
WITHNEW="new"
FILE="tmpfile"
OUTPUT=""
while read LINE || [ "$LINE" ]; do
case "$LINE" in
*${REPLACEOLD}*)OUTPUT="${OUTPUT}${LINE//$REPLACEOLD/$WITHNEW}
";;
*)OUTPUT="${OUTPUT}${LINE}
";;
esac
done < "${FILE}"
printf "${OUTPUT}" > "${FILE}"
per il caso semplice si potrebbe omettere l'istruzione case:
while read LINE || [ "$LINE" ]; do
OUTPUT="${OUTPUT}${LINE//$REPLACEOLD/$WITHNEW}
"; done < "${FILE}"
printf "${OUTPUT}" > "${FILE}"
Nota:il ...|| [ "$LINE" ]... serve per evitare di perdere l'ultima riga di un file che non termina con una nuova riga (ora conosci almeno un motivo per cui il tuo editor di testo continua ad aggiungerli)