【问题标题】:Extracting a string between two patterns in bash with a regex使用正则表达式在bash中提取两个模式之间的字符串
【发布时间】:2014-07-18 09:20:12
【问题描述】:

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

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

我应该使用什么来提取该值? sed, awk, expr 匹配?

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

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

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

【问题讨论】:

  • 发布一个更完整的示例,其中包含特定的输入和预期的输出。

标签: regex string bash awk sed


【解决方案1】:

您可以使用以下 sed 命令:

valueOfInterest=$(sed -n '/keyForValueIWant/ s/.*=>"\([^"]*\).*/\1/p' <<< "$input")

-n 默认禁用输出。正则表达式/keyForValueIWant/ 仅将以下操作限制为与正则表达式匹配的那些行。下面的替换命令将值过滤掉并打印出来/p

【讨论】:

  • 对不起,我应该解释得更好。如果我希望结果是变量而不是文件怎么办?
  • 好的。已编辑我的答案。如果您需要在变量中输出命令,请使用command substitution
  • 我可以把file.txt去掉吗?
  • 当然。这只是一个例子。将其替换为您的实际输入文件名。
  • 我的数据不在输入文件中,而是在 bash 变量中。
【解决方案2】:

尝试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'("|=&gt;)' 告诉 awk 将每一行拆分为基于 "=&gt; 作为分隔符的字段 - 实际上,这会将字段 2 中的键 ($2) 和字段 5 中的值 (@ 987654328@)
  • 感兴趣的键作为 shell 变量 ($key) 传递给 awk 作为同名变量 (-v key=...)。
  • 如果输入行的键与指定键 ($2==key) 匹配,则打印包含值的第 5 个字段 (print $5)。
  • exit 确保在找到匹配项后停止处理,以防止对文件的其余部分进行不必要的解析(注意:这假定键是真正的键,即它们在输入文件中是唯一的)。

【讨论】:

    猜你喜欢
    • 2018-11-22
    • 1970-01-01
    • 1970-01-01
    • 2017-04-15
    • 1970-01-01
    • 2012-05-30
    • 1970-01-01
    • 2020-08-19
    • 2014-06-12
    相关资源
    最近更新 更多