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