bash:找到文件中的所有正则表达式并放入数组中

时间:2017-06-04 13:30:46

标签: arrays regex bash awk grep

我有一个带有 PlaceHolders 的模板配置文件,我想找到所有这些PlaceHolders并放入一个数组。

当前状态:
只有在没有超过一个 PlaceHolder

时,我才能在文件中找到所有PlaceHolders。

例如,这是我的模板文件:

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}} ,因为同一行中已有另一场比赛。

我的问题是:
如何在文件中找到所有匹配项而不管该行?

1 个答案:

答案 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:仅打印匹配行的匹配(非空)部分,每个此类部分位于单独的输出行上。

     

*前面的表达式可以匹配零次或多次。使用? *尝试匹配尽可能少(非贪婪)。

请参阅:The Stack Overflow Regular Expressions FAQ