Как вставить текст перед первым определенным элементом в строке?

Как исправить мою команду sed, чтобы она нашла первое вхождение строки "location", которая не начинается с символа комментария, и вставила "0000" перед этой строкой?
  • 22 января 2024 г. 19:59
Ответы на вопрос 2
Если у вас есть, например, файл конфигурации со строками, которые могут начинаться с символа комментария `#` и вы хотите вставить текст перед первым вхождением строки "location", которое не следует за символом комментария, вы можете использовать следующую команду `sed`.

Допустим, у вас есть файл `config.txt`:

```
# some config line
# location should not be matched
some setup line
location should be matched
another location line
```

Вам нужно вставить "0000" перед строкой "location should be matched". Команда `sed` для этого:

```sh
sed '/^[^#]*location/ s/location/0000 &/' config.txt
```

Это работает следующим образом:

- `^[^#]*location` - Выбирает строки, которые имеют "location" и не начинаются с `#` (символ `^` в качестве первого символа в скобках означает отрицание, т.е., любой символ, кроме `#`, может повторяться 0 или более раз до "location").
- `s/location/0000 &/` - Заменяет первое вхождение "location" в этих строках на "0000 location". Амперсанд `&` используется в шаблоне замены `sed` как ссылка на всё что было найдено поиском (в данном случае "location").

Обратите внимание, что если у вас есть строки, которые содержат пробелы перед "location" и они тоже считаются закомментированными, вам нужно будет скорректировать ваш шаблон поиска в соответствии с вашими требованиями.

Пример использования этой команды для записи изменений обратно в файл (с использованием `sed` с опцией `-i` для редактирования файла на месте):

```sh
sed -i '/^[^#]*location/ s/location/0000 &/' config.txt
```

Теперь содержимое файла `config.txt` будет выглядеть так:

```
# some config line
# location should not be matched
some setup line
0000 location should be matched
another location line
```
#!/bin/bash
line=`grep -n '^ *location' myfile | sed -rn '1s/(.+):.+/\1/p'` # номер первой строки с location
sed -ri "$line s/.+/0000\n&/" myfile
Похожие вопросы