Поскольку это не может быть помечено как дубликат SO-вопроса, я полагаю, что правильно разместить ответ здесь, в U&L.
\b
перемещает курсор на один символ назад, но не стирает этот символ. Последний напечатанный символ перезапишет символ.
$ echo -e "hello world\bX"
hello worlX
Прежде всего, вы должны убедиться, что ваша переменная key
не содержит никаких символов, имеющих особое значение для вашей команды sed
, например, /
, который является разделительным символом по умолчанию для подстановки sed. В таком случае вы можете использовать другой символ, например, вот так "s@pattern@replacement@g" file
.
Затем вам нужно сопоставить от открывающей до соответствующей закрывающей скобки. Это будет \[.*\]
, но sed жадный :. Если ваша строка содержит [text1] text2 [text3]
, sed будет соответствовать всему этому. Поэтому вам нужно определить вместо .*
любой символ, который не является закрывающей скобкой, ноль или более раз:[^]]*
.
Обратите внимание, что в приведенном выше примере нам не нужно экранировать(\]
)скобку посередине, потому что sed
ожидает исключения по крайней мере одного символа после знака вставки (^
), поэтому это не будет неправильно истолковано. как закрывающая скобка списка исключенных символов, но как буквальная скобка.
Теперь, если вы хотите внести изменения в -место, вы можете использовать -i
, как описано в этом посте . Но сначала проверьте без -i
, проверьте часть вывода, чтобы убедиться, что она выглядит хорошо.
Таким образом, это sed
должно работать в вашем случае:
sed -i "s/\[[^]]*\]/$key/g" file
В регулярном выражении отсутствует '.' перед '*'. Если вы уверены, что есть только одна открывающая и одна закрывающая скобка, то это должно работать:
sed "s/\[.*\]/$key/g" /tmp/file
Это выводит на стандартный вывод, если вы хотите отредактировать в -месте, используйте sed -i
.