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

Как исправить ошибку sed: -e expression #1, char 22: extra characters after command при попытке добавления строки в файл с помощью скрипта в среде git bash под Windows для Linux?
  • 21 января 2024 г. 16:48
Ответы на вопрос 2
Ошибка `extra characters after command` в `sed` обычно указывает на то, что после команды в `sed`-выражении присутствуют лишние символы, которые `sed` не ожидает.

Одна из возможных причин такой ошибки — попытка использовать синтаксис `sed`, который корректен для GNU `sed` (обычно используемый на системах Linux), в системе с `sed` от BSD или других UNIX-подобных систем, включая Git Bash под Windows, которые могут иметь различные реализации `sed`.

Например, если вы пытаетесь добавить строку после определенной строки с помощью команды `sed 'a'` в GNU `sed`, но в вашем случае команда реализована немного по-другому.

Допустим, ваша команда выглядит так:

```sh
sed 'a\Новая строка' file.txt
```

Для добавления строки в `sed` из GNU часто используют следующий синтаксис:

```sh
sed '/pattern/a Новая строка' file.txt
```

Для BSD или Git Bash под Windows синтаксис должен быть изменин. Например, команда для добавления строки после строчки содержащей "pattern" будет выглядеть так:

```sh
sed '/pattern/a\
Новая строка' file.txt
```

Обратите внимание на обратный слеш и перевод строки после него, это нужно для корректного интерпретирования команды `sed`.

Если вы пытаетесь добавить строку в определенную позицию (например, в конец файла), используйте команду следующим образом:

```sh
sed -e '$a\
Новая строка' file.txt
```

Также возможно проблема может быть связана с тем, что Git Bash под Windows может использовать обратные слеши в качестве escape-символов, в то время как в Unix-подобных системах используется другой механизм экранирования. В таком случае попробуйте в вашем скрипте перед каждым обратным слешем поставить ещё один, чтобы экранировать его, или использовать одинарные кавычки вместо двойных.

Если проблема не решается данными подходами, пожалуйста, предоставьте точный пример команды `sed`, которую вы пытаетесь выполнить, для более детального анализа.
каждая вставляемая строка должна оканчиваться слэшом

#!/bin/bash
location='
    location /projects/test/v2.0.1-4 {
        proxy_pass http://0.0.0.0:2222;
    }'

sed -i "
/modsecurity/i ${location//$'\n'/\\$'\n'}
" MYFILE
Похожие вопросы