Вы можете сделать это только с оболочкой.В этом примере используется ненужный оператор case для этого конкретного примера, но я включил его, чтобы показать, как можно включить несколько замен.Хотя код больше, чем Sed 1-liner, он обычно намного быстрее, поскольку он использует только встроенные функции оболочки (целых 20x для небольших файлов).
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}"
для простого случая можно было бы опустить случайоператор:
while read LINE || [ "$LINE" ]; do
OUTPUT="${OUTPUT}${LINE//$REPLACEOLD/$WITHNEW}
"; done < "${FILE}"
printf "${OUTPUT}" > "${FILE}"
Примечание: ... ||["$ LINE"] ... бит предназначен для предотвращения потери последней строки файла, которая не заканчивается новой строкой (теперь вы знаете хотя бы одну причину, по которой ваш текстовый редактор продолжает добавлять их)