在任意一行文本中,bash 如何提取等号后的命名值?

在任意一行文本中,bash 如何提取等号后的命名值?

这个问题 (如何获取等号后的值)基本上就是我想要的:

给定一行文本,带有类似语法的命名参数color=red,使用 bash 如何获取该颜色值(产生red)?

除了那个问题之外,文本行完全是那些键值对,所以接受的答案利用了 bash,eval因为该语法恰好非常适合。


我想知道一行通用的文字,比如⎜ ↳ Synaptics TM3289-021 id=13 ]我如何才能获取那个 id 值(yielding 13)?

也许利用正则表达式,我知道该行将包含[whitespace]id=<TEXT I WANT>[whitespace]

答案1

使用grep-o(仅输出匹配的文本)选项。阅读man grep并执行:

echo "bunch of. text id=13 more=4" | \
  grep -E -o 'id=[0-9]+`

如果您想要格外小心,请同时匹配前导和尾随空格:

echo "bunch of. text id=13 more=4" | \
  grep -E -o ' id=[0-9]+ '

答案2

如果你真的想要狂欢要提取值,可以使用带有测试括号=~内运算符的正则表达式,例如:[[ ... ]]

$ re='\bid=([^[:blank:]]*)'
$ line='⎜ ↳ Synaptics TM3289-021 id=13 ]'
$ 
$ [[ $line =~ $re ]] && printf '%d\n' "${BASH_REMATCH[1]}"
13

请注意,我使用\b(单词边界)而不是空格作为起始锚点 - 这允许表达式匹配出现id=13在行首以及行中部分的情况。

如果您想使用 grep,那么我建议使用 GNU grep 的 perl 兼容模式,这样您可以匹配但不包含以下部分id=

$ printf '%s\n' "$line" | grep -Po '(?<=id=)\w*'
13

或者

$ printf '%s\n' "$line" | grep -Po 'id=\K\w*'
13

这里,\w*匹配一个(可能为空的)单词字符序列 - 如果您只想匹配数字 ID,您可以更改\w\d

相关内容