Вы должны использовать sed? Если вы пишете скрипт bash, вы можете сделать
#!/bin/bash
pattern='abc'
replace='def'
file=/path/to/file
tmpfile="${TMPDIR:-/tmp}/$( basename "$file" ).$$"
while read -r line
do
echo "${line//$pattern/$replace}"
done < "$file" > "$tmpfile" && mv "$tmpfile" "$file"
В более старой оболочке Bourne (например, ksh88 или POSIX sh) у вас может не быть такой крутой структуры ${var/pattern/replace}
, но у вас есть ${var#pattern}
и ${var%pattern}
, которые можно использовать для разделения строки и затем соберите его. Если вам нужно сделать это, вы получите гораздо больше кода - но на самом деле это не так уж плохо.
Если вы еще не находитесь в сценарии оболочки, вы можете довольно легко создать параметры шаблона, замены и имени файла и просто вызвать его. :)
PS - структура $ {TMPDIR: - / tmp} использует $ TMPDIR, если это установлено в вашей среде, или использует / tmp, если переменная не установлена. Мне нравится вставлять pid текущего процесса в конец имени файла в надежде, что оно будет немного более уникальным. Вам, вероятно, следует использовать mktemp или аналогичный в «реальном мире», но для быстрого примера это нормально, а двоичный файл mktemp не всегда доступен.