Если вы хотите сделать это с помощью sed (чего делать не следует, см. ниже), используйте
sed "/fooy/c\\$var"
Это проблема расширения оболочки. \$ в строке, заключенной в двойные кавычки, означает буквальный доллар, поэтому $var не раскрывается. GNU sed также принимает
sed "/fooy/c$var"
пока вы не укажете --posix, но BSD sed (как у вас во FreeBSD или MacOS X) будет жаловаться на это.
Однако делать это с помощью sed не очень хорошая идея. Подстановка переменных оболочки в код sed почти никогда не является хорошей идеей, потому что это делает вас уязвимым для внедрения кода. Возьмем, например,
$ var=$(echo -e 'something\nd')
$ echo -e "foo bar\nfooy bary\nfoot bart" | sed --posix "/fooy/c\\$var"
something
Это было не то, что мы ожидали, не так ли? Что происходит здесь, так это то, что sed, поскольку он не может различить, что вы хотите, чтобы он обрабатывал как данные ($var) и код, обрабатывает $var как код, и поэтому он обрабатывает d после \n в нем как команду (удалить текущая строка). Лучше использовать awk:
$ var=$(echo -e 'something\nd')
$ echo -e "foo bar\nfooy bary\nfoot bart" | awk -v var="$var" '/fooy/ { print var; next } 1'
foo bar
something
d
foot bart
Это позволяет обойти проблему внедрения кода, не рассматривая $var как код.
30.01.2015
'/pattern/ {...}'вawk. Обязательно начну использовать. 30.01.2015