我有一个带有 PlaceHolders 的模板配置文件,我想找到所有这些PlaceHolders并放入一个数组。
当前状态:
只有在行中没有超过一个 PlaceHolder
例如,这是我的模板文件:
upstream portal {
server {{UNICORN_SERVICE_NAME}}:{{UNICORN_SERVICE_PORT}};
}
server {
listen *:80 default_server;
server_name {{APP_HOST}};
server_tokens off;
root /dev/null;
# Increase this if you want to upload large attachments
# Or if you want to accept large git objects over http
client_max_body_size {{NGINX_MAX_UPLOAD_SIZE}};
location {{GITLAB_RELATIVE_URL_ROOT}}/ {
root /var/lib/nginx/portal;
# serve static files from defined root folder;.
# @gitlab is a named location for the upstream fallback, see below
}
}
这是我用来查找PlaceHolders的代码:
matches_bloc=$(awk 'match($0, /(\{\{)([^{]*)(\}\})/) {
print substr($0, RSTART, RLENGTH)
}' ${currFile})
# convert 'matches_bloc' into array
matches=()
echo "Matches:"
while read -r line; do
matches+=("$line")
echo " - ${line}"
done <<< "$matches_bloc"
在本例中,匹配结果为:
件:
- {{UNICORN_SERVICE_NAME}}
- {{APP_HOST}}
- {{NGINX_MAX_UPLOAD_SIZE}}
- {{GITLAB_RELATIVE_URL_ROOT}}
您可以注意到文件中有5个PlaceHolders,只有4个匹配 缺少的匹配是: {{UNICORN_SERVICE_PORT}} ,因为同一行中已有另一场比赛。
我的问题是:
如何在文件中找到所有匹配项而不管该行?
答案 0 :(得分:3)
查找模板文件中的所有变量并将它们放入数组中。
使用GNU grep:
array=( $(grep -Po '{{.*?}}' file) )
declare -p array
输出:
declare -a array='([0]="{{UNICORN_SERVICE_NAME}}" [1]="{{UNICORN_SERVICE_PORT}}" [2]="{{APP_HOST}}" [3]="{{NGINX_MAX_UPLOAD_SIZE}}" [4]="{{GITLAB_RELATIVE_URL_ROOT}}")'
-P
:将{{.*?}}
解释为Perl正则表达式。
-o
:仅打印匹配行的匹配(非空)部分,每个此类部分位于单独的输出行上。
*
前面的表达式可以匹配零次或多次。使用?
*
尝试匹配尽可能少(非贪婪)。