Regex для соответствия блоку местоположения nginx?

Я работаю над сценарием bash, который может добавлять блоки местоположения nginx в файл, а также удалять их, если они уже существуют. Для удаления блока, если он уже существует, я сделал следующее регулярное выражение. Регулярное выражение должно соответствовать всему многострочному блоку следующим образом:

      location /URLGOESHERE {
  try_files $uri /URLGOESHERE/index.php?$query_string;
}

У меня есть это регулярное выражение, которое работает, но только если есть пустая строка до и после блока ^location\s\/${URLGOESHERE} {[\s\S]*?(?=\n{2,})$

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

Я хотел бы, чтобы регулярное выражение соответствовало чему-либо внутри блока, пока закрывающая скобка }

1 ответ

С вашими показанными образцами / попытками попробуйте следующее awkкод. Это даст операторы между {to}, удаляющие из него новые строки.

      awk -v RS='location[[:space:]]+/URLGOESHERE[[:space:]]+{\n*[[:space:]]+try_files[[:space:]]+\\$uri[[:space:]]+\\/[^?]*\\?\\$query_string;\n*}' '
RT{
  gsub(/.*\n*{\n*[[:space:]]+/,"",RT)
  gsub(/\n*}/,"",RT)
 print RT
}
'  Input_file

Объяснение: Создание разделителя полей в соответствии с показанными примерами для сопоставления значений для получения блока Location, включая пустые строки, а затем в каждом сопоставленном значении разделителя удаление пустых строк.

Например, скажем, у нас есть следующий Input_file:

      cat Input_file
location /URLGOESHERE {

  try_files $uri /URLGOESHERE/index.php?$query_string;



}

location /URLGOESHERE {
  try_files $uri /URLGOESHERE/index.php?$query_string;
}

После выполнения вышеуказанного кода мы получим следующий вывод :

      try_files $uri /URLGOESHERE/index.php?$query_string;
try_files $uri /URLGOESHERE/index.php?$query_string;

Объяснение используемого регулярного выражения: добавление подробного объяснения приведенного выше кода.

      location[[:space:]]+/URLGOESHERE   ##Matching location followed by spaces followed by /URLGOESHERE
[[:space:]]+{\n*                   ##Followed by spaces { and 0 or more new lines.
[[:space:]]+try_files[[:space:]]+  ##Followed by spaces try_files followed by 1 or more spaces.
\\$uri[[:space:]]+                 ##followed by $uri spaces here.
\\/[^?]*\\?\\$query_string;\n*}    ##followed by / till ? occurrence followed by $query_stirng; followed by 0 or more new lines.
Другие вопросы по тегам