sed を使用できます:
sed -i 's/MyCar on/MyCar off/' path/to/file
これは、シェルのみで実行できます。この例では、この特定の例では不必要な case ステートメントを使用していますが、複数の置換を組み込む方法を示すために含めました。コードは sed 1-liner よりも大きくなりますが、シェルのビルトインのみを使用するため、通常ははるかに高速です (小さなファイルの場合は 20 倍程度)。
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}"
単純なケースでは、case ステートメントを省略できます:
while read LINE || [ "$LINE" ]; do
OUTPUT="${OUTPUT}${LINE//$REPLACEOLD/$WITHNEW}
"; done < "${FILE}"
printf "${OUTPUT}" > "${FILE}"
注:...|| [ "$LINE" ]... ビットは、新しい行で終わらないファイルの最後の行が失われないようにするためのものです (これで、テキスト エディターがそれらを追加し続ける理由が少なくとも 1 つわかりました)