我在bash变量中有一个带键/值对的字符串。我想要的值就像这样隐藏。
{"keyIDontCareAbout"=>"valueIDontCareAbout",
"keyForValueIWant"=>"valueIWant",
...............bunch more keys
}
我应该使用什么来提取该值? sed
,awk
,expr
匹配?
我的想法是,我应该提取前面带有“keyForValueIWant”=>“的字符串,然后是”但是我很难决定使用哪个工具。
expr
匹配似乎很糟糕,因为它在表达式的末尾或者在一个表达式的开头抓取一个字符串,但是我的字符串位于一堆字符的中间。
基本上,我无法弄清楚两个其他子串之间的子字符串的正则表达式语法。
答案 0 :(得分:2)
您可以使用以下sed命令:
valueOfInterest=$(sed -n '/keyForValueIWant/ s/.*=>"\([^"]*\).*/\1/p' <<< "$input")
-n
默认禁用输出。正则表达式/keyForValueIWant/
仅将以下操作限制为与正则表达式匹配的/那些行。以下替换命令会过滤掉行中的值并将其打印出来/p
。
答案 1 :(得分:1)
尝试awk
,如下所示:
# Specify key of interest.
key='keyForValueIWant'
# Extract matching value, assuming that the input data is
# in shell variable $input:
value=$(awk -F'("|=>)' -v key="$key" '$2==key { print $5; exit }' <<<"$input")
# Print result.
echo "Value for $key: [$value]"
-F'("|=>)'
告诉awk
将每一行拆分为基于"
或=>
作为分隔符的字段 - 实际上,这会将密钥放在字段2中({{ 1}}),以及字段5中的值($2
)$5
)传递给$key
作为同名变量(awk
)。-v key=...
)匹配,则打印包含值的第5个字段($2==key
)。print $5
确保一旦找到匹配就停止处理,以防止对文件的其余部分进行不必要的解析(注意:这假设密钥是真正的密钥,即它们在输入文件中是唯一的)