Podrías usar sed:
sed -i 's/MyCar on/MyCar off/' path/to/file
Puedes hacer esto solo con shell. Este ejemplo usa una declaración de caso innecesaria para este ejemplo en particular, pero la incluí para mostrar cómo podría incorporar múltiples reemplazos. Aunque el código es más grande que un sed 1-liner, por lo general es mucho más rápido, ya que solo usa shell integrado (hasta 20 veces para archivos pequeños).
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}"
para el caso simple, se podría omitir la declaración del caso:
while read LINE || [ "$LINE" ]; do
OUTPUT="${OUTPUT}${LINE//$REPLACEOLD/$WITHNEW}
"; done < "${FILE}"
printf "${OUTPUT}" > "${FILE}"
Nota:el ...|| [ "$LINE" ]... bit es para evitar perder la última línea de un archivo que no termina en una nueva línea (ahora conoce al menos una razón por la cual su editor de texto sigue agregando esos)