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.