使用正则表达式在bash中提取两个模式之间的字符串

时间:2014-05-28 23:54:30

标签: regex string bash awk sed

我在bash变量中有一个带键/值对的字符串。我想要的值就像这样隐藏。

{"keyIDontCareAbout"=>"valueIDontCareAbout",
  "keyForValueIWant"=>"valueIWant",
 ...............bunch more keys 
}

我应该使用什么来提取该值? sedawkexpr匹配?

我的想法是,我应该提取前面带有“keyForValueIWant”=>“的字符串,然后是”但是我很难决定使用哪个工具。

expr匹配似乎很糟糕,因为它在表达式的末尾或者在一个表达式的开头抓取一个字符串,但是我的字符串位于一堆字符的中间。

基本上,我无法弄清楚两个其他子串之间的子字符串的正则表达式语法。

2 个答案:

答案 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
  • 感兴趣的键作为shell变量($5)传递给$key作为同名变量(awk)。
  • 如果输入行的键与指定的键(-v key=...)匹配,则打印包含值的第5个字段($2==key)。
  • print $5确保一旦找到匹配就停止处理,以防止对文件的其余部分进行不必要的解析(注意:这假设密钥是真正的密钥,即它们在输入文件中是唯一的)