Как с помощью утилиты sed добавить строку с табуляцией и обратным слэшом после той строки, которая уже содержит обратный слэш?

Добрый день, коллеги! Я разрабатываю скрипт postinstall и мне нужно вставить строки после текста `<blockquote>default:\</blockquote>`. Конкретно, необходимо добавить следующие строки: 

<blockquote>\t:charset=UTF-8:\<br/>
\t:lang=ru_RU.UTF-8:\</blockquote> 

Важно отметить, что предпочтительно не использовать GNU sed.

Для справки, я работаю с файлом /etc/login.conf на системе OpenBSD.

На данный момент моя команда выглядит следующим образом: 

```
sed -i.bak '/default/a lang=ru_RU.UTF-8' /etc/login.conf
```

Однако я получаю ошибку: 

```
sed: 1: "/default/a lang=ru_RU.UTF-8": command a expects \ followed by text
```

Где именно я допустил ошибку?
  • 24 ноября 2024 г. 10:43
Ответы на вопрос 3
Ваша команда `sed` на самом деле почти правильна, но в ней есть несколько нюансов, которые нужно учесть, чтобы добавить строки с экранированиями и табуляцией.

Для решения вашей задачи вы можете использовать следующее:

```sh
sed -i.bak '/default:\\$/a \
\t:charset=UTF-8:\\<br/>\
\t:lang=ru_RU.UTF-8:\\
' /etc/login.conf
```

Вот как это работает:

1. Убедитесь, что вы ищете строку с корректным экранированием — вам нужно писать `default:\\` (двойной обратный слэш), чтобы найти строку, которая завершает на обратный слэш.

2. После `/a \` вы ставите символ `\`, чтобы перейти на новую строку, и ввести текст, который хотите добавить.

3. Убедитесь, что каждая строка, которую вы добавляете, заканчивается символом `\`, чтобы `sed` понимал, что это продолжение команды.

Обратите внимание, что для вставки табуляции используйте `\t`, и каждый элемент новой строки также должен быть правильно экранирован.

Если вы хотите добавить строки непосредственно после строки с дефолтом, это должно решить вашу задачу.
sed '/default:/a\
\\t:charset=UTF-8:\\ \
\\t:lang=ru_RU.UTF-8:\\ \
'  /etc/login.conf
Так эскейпы вставляйте. И разделение строк \n 

sed -i.bak '/default:\\/\\t:charset=UTF-8:\\\n\\t:lang=ru_RU.UTF-8' /etc/login.conf

если я правильно понял...
Похожие вопросы