Если вы хотите сделать это с помощью 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