sed + заменить строку в квадратных скобках на ключ

Поскольку это не может быть помечено как дубликат SO-вопроса, я полагаю, что правильно разместить ответ здесь, в U&L.

\bперемещает курсор на один символ назад, но не стирает этот символ. Последний напечатанный символ перезапишет символ.

$ echo -e "hello world\bX"
hello worlX
1
01.11.2020, 22:24
2 ответа

Прежде всего, вы должны убедиться, что ваша переменная keyне содержит никаких символов, имеющих особое значение для вашей команды sed, например, /, который является разделительным символом по умолчанию для подстановки sed. В таком случае вы можете использовать другой символ, например, вот так "s@pattern@replacement@g" file.

Затем вам нужно сопоставить от открывающей до соответствующей закрывающей скобки. Это будет \[.*\], но sed жадный :. Если ваша строка содержит [text1] text2 [text3], sed будет соответствовать всему этому. Поэтому вам нужно определить вместо .*любой символ, который не является закрывающей скобкой, ноль или более раз:[^]]*.

Обратите внимание, что в приведенном выше примере нам не нужно экранировать(\])скобку посередине, потому что sedожидает исключения по крайней мере одного символа после знака вставки (^), поэтому это не будет неправильно истолковано. как закрывающая скобка списка исключенных символов, но как буквальная скобка.

Теперь, если вы хотите внести изменения в -место, вы можете использовать -i, как описано в этом посте . Но сначала проверьте без -i, проверьте часть вывода, чтобы убедиться, что она выглядит хорошо.

Таким образом, это sedдолжно работать в вашем случае:

sed -i "s/\[[^]]*\]/$key/g" file
1
18.03.2021, 22:53

В регулярном выражении отсутствует '.' перед '*'. Если вы уверены, что есть только одна открывающая и одна закрывающая скобка, то это должно работать:

sed "s/\[.*\]/$key/g" /tmp/file

Это выводит на стандартный вывод, если вы хотите отредактировать в -месте, используйте sed -i.

1
18.03.2021, 22:53

Теги

Похожие вопросы