2017-06-04 3 views
2

PlaceHoldersというテンプレート設定ファイルがあります。これらのすべてのPlaceHoldersを探して配列に配置したいと思います。bash:ファイル内のすべての正規表現を見つけて配列に入れよう

海流状態:
私はラインなし以上プレースホルダがある場合にのみ、ファイル内のすべてのプレースホルダを見つけることができます。たとえばでは、これは私のテンプレートファイル

をされています

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" 

この例では一致した結果は次のようになります。

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  
    } 
    } 

これは私がプレースホルダを見つけるために使用するコードです:

一致:
- {{UNICORN_SERVICE_NAME}}
- {{APP_HOST}}
- {{NGINX_MAX_UPLOAD_SIZE}}
- {{GITLAB_RELATIVE_URL_ROOT}}

ファイル5つのプレースホルダがあることに気づくことができ

と一致するのは4つだけです。
一致しない一致は、同じ行にもう1つの一致があるため、{{UNICORN_SERVICE_PORT}}です。

私の質問は:
どのように私は関係なく、行のファイル内のすべての一致を見つけることができますか?

答えて

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:一致する行の一致する(空でない)部分だけを出力し、そのような部分はそれぞれ別の出力行に出力します。

*上記の式は、0回以上一致する可能性があります。 ?では、*は可能な限り一致させようとします(非貪欲型)。


参照してください:The Stack Overflow Regular Expressions FAQ

+0

おかげで男を!偉大な作品とシンプルな私のソリューションを一致 – Evya2005

+1

良いコードのcyrusありがとう、正規表現の部分を説明してください、あなたに感謝するでしょう。 – RavinderSingh13

+0

@ RavinderSingh13:答えを更新しました。 – Cyrus

関連する問題