Как найти конкретную строку в блоке и внести изменения в неё?

Как изменить порт только в блоке /test/v2.0.0 конфигурационного файла test.nginx с использованием команды sed? Текущие попытки не приводят к желаемому результату.
  • 27 января 2024 г. 9:59
Ответы на вопрос 2
Для изменения конкретного порта в определенном блоке конфигурации NGINX с помощью `sed`, вам сначала необходимо точно определить уникальный паттерн, который поможет `sed` знать, где начинать и заканчивать внесение изменений. Предположим, что конфигурационный файл выглядит следующим образом:

```
server {
    # Some config
}

server {
    location /test/v2.0.0 {
        # Some config
        listen 8080;
        # More config
    }
}

server {
    # Some other config
}
```

И вы хотите изменить порт с 8080 на 9090 только в блоке `/test/v2.0.0`. Вы можете использовать следующую команду `sed`:

```sh
sed -i '/location \/test\/v2\.0\.0/,/}/ s/listen 8080;/listen 9090;/' test.nginx
```

Детальное описание команды:

- `-i` - редактировать файлы на месте. Если вы хотите сохранить оригинальный файл без изменений, используйте `-i.bak`, это создаст резервную копию с расширением `.bak`.
- `/location \/test\/v2\.0\.0/,/}/` - диапазон шаблонов для `sed`, где он начинает действовать когда видит `location /test/v2.0.0` и заканчивает, когда видит символ `}`. Помните, что это работает только если у вас нет вложенных фигурных скобок в блоке `location`.
- `s/listen 8080;/listen 9090;/` - команда подстановки, которая заменяет `listen 8080;` на `listen 9090;`.

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

Также помните, что редактирование конфигурационных файлов следует выполнять с большой осторожностью, чтобы избежать синтаксических ошибок, которые могут привести к сбоям службы. После изменения проверьте синтаксис NGINX с помощью `nginx -t` перед перезагрузкой службы.
#!/bin/bash
echo 'server {
    location /test/v2.0.3 {
        modsecurity on;
        proxy_pass http://10.1.0.6:3000;
    }
    location /test/v2.0.0 {
        modsecurity on;
        proxy_pass http://10.1.0.6:3000;
    }
}' | sed -r '\!^\s+location /test/v2.0.0 \{!,/^\s+\}$/ s/:3000;/:5555;/'
Похожие вопросы