
私のファイルにデータがあります{{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 つのカンマが含まれていると想定されます。
grep
POSIXlyでは、このコマンドを次のように置き換えることができます。
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