二重括弧間の値の取得

二重括弧間の値の取得

私のファイルにデータがあります{{1,department}}

次の値をキャプチャする必要があります。

val1=1
val2=department

単一の{}を使用してデータを取得するためにawkコマンドを使用してみましたが、うまくいきました。ただし、double {{}}の場合、このコマンドは機能しません。

私が使用するコマンドは次のとおりです。

`var1=`echo $line | awk -F '[{}]' '{print $2}' | awk -F '[,]' '{print $1}'

ベストアンサー1

GNUgrepおよびPOSIXシェルの使用:

out=$(grep -Po '\{\{\K.*?(?=\}\})' < your-file)
val1=${out%%,*}
val2=${out#*,}
  • -P:合計演算子grepとしてPerl準拠の正規表現を使用するように指示します。\K(?=)
  • \K:設定が始まります返品値。a\Kb一致abが返しますb。したがって、ここでは一致しますが、{{...出力から除外するために返します...{{
  • (?=...)同じ効果を得るために}}...一致する場合、幅はゼロに一致しますが...戻り値には含まれない予測演算子です。
  • したがって$out、最終的には、標準のシェル演算子を1,department使用して最初のコンマの前後部分を抽出します。${var%%pattern}${var#pattern}

ファイルには 1 つの{{...}}エントリと少なくとも 1 つのカンマが含まれていると想定されます。

grepPOSIXlyでは、このコマンドを次のように置き換えることができます。

sed -n 's/.*{{\([^}]*\)}}.*/\1/p'

今あなたがいるなら

some text {{1,department}} other text

シェル変数から以下を使用して抽出することもできます。

  • zsh

    if [[ $string =~ '\{\{([^},]*),([^}]*)\}\}' ]]; then
      val1=$match[1] val2=$match[2]
    fi
    
  • bash

    if [[ $string =~ \{\{([^},]*),([^}]*)\}\} ]]; then
      val1=${BASH_REMATCH[1]} val2=${BASH_REMATCH[2]}
    fi
    

おすすめ記事