Если это построчная и только одна строка для замены, я рекомендую добавить к самому файлу заменяющую строку, используя printf
, сохраняя эта первая строка в пространстве хранения sed
, и при необходимости отбрасывать ее. Таким образом, вам совсем не нужно беспокоиться о специальных символах. (Единственное предположение здесь состоит в том, что $ VAR
содержит одну строку текста без каких-либо символов новой строки, о чем вы уже говорили в комментариях.) Кроме новых строк, VAR может содержать что угодно ], и это будет работать независимо.
VAR=whatever
{ printf '%s\n' "$VAR";cat somefile; } | sed '1{h;d;};/KEYWORD/g'
printf '% s \ n'
напечатает содержимое $ VAR
как буквальную строку, независимо от ее содержимого, за которой следует новая строка.( echo
в некоторых случаях будет делать другие вещи, например, если содержимое $ VAR
начинается с дефиса - это будет интерпретироваться как флаг опции, передаваемый в echo
.)
Фигурные скобки используются для добавления вывода printf
к содержимому somefile
, когда он передается в sed
. Здесь важны пробелы, разделяющие фигурные скобки сами по себе, как и точка с запятой перед закрывающей фигурной скобкой.
1 {h; d;};
как команда sed
сохранит первую строку текста в sed
удерживаемом пространстве , затем d
удаляет строку (а не печатает ее).
/ KEYWORD /
применяет следующие действия ко всем строкам, содержащим KEYWORD
. Действие g
et, которое получает содержимое пространства удержания и удаляет его вместо пространства шаблонов - другими словами, всю текущую строку. (Это не для замены только части строки.) Между прочим, удерживаемое пространство не очищается, просто копируется в пространство шаблонов, заменяя все, что там есть .
Если вы хотите привязать свое регулярное выражение, чтобы оно не соответствовало строке, которая просто содержит KEYWORD, а только строку, в которой нет ничего, кроме KEYWORD, добавьте привязка начала строки ( ^
) и привязка конца строки ( $
) к вашему регулярному выражению:
VAR=whatever
{ printf '%s\n' "$VAR";cat somefile; } | sed '1{h;d;};/^KEYWORD$/g'