二重括弧間の値の取得

二重括弧間の値の取得

私のファイルにデータがあります{{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
    

答え2

$ echo "{{1,department}}" | awk -F "{{|}}|," '{print $3}'
department

$ echo "{{1,department}}" | awk -F "{{|}}|," '{print $2}'
1

答え3

以下を使用して値(前にスペースを含む)を印刷できます。

$ echo "{{1,department}}" | awk -F '[ {},]' 'NF=NF'
 1 department

これにより、値を読み取ることができます。

read val1 val2 <<<$(echo "{{1,department}}" | awk -F '[ {},]' 'NF=NF')

これは角かっこやその他すべてのフィールドに適用されます。

$ echo "{{1,department,name,list}}" | awk -F '[ {},]' 'NF=NF'
 1 department name list

grepも同様のソリューションを提供できます。

$ echo '{1,department}' | grep -Po '(?<={|,)[^{,}]*(?=,|})'
1
department

$ echo '{{1,department}}' | grep -Po '(?<={|,)[^{,}]*(?=,|})'
1
department

$ echo '{{1,department,name,list}}' | grep -Po '(?<={|,)[^{,}]*(?=,|})'
1
department
name
list

シェルの変数は正確なフィールド数と一致する必要があります。

$ value='{{1,department}}'
$ re='\{\{([^},]*),([^}]*)\}\}'
$ [[ $value =~ $re ]] && echo "${BASH_REMATCH[@]:1}"
1 department

関連情報