![在任意一行文本中,bash 如何提取等号后的命名值?](https://linux22.com/image/942784/%E5%9C%A8%E4%BB%BB%E6%84%8F%E4%B8%80%E8%A1%8C%E6%96%87%E6%9C%AC%E4%B8%AD%EF%BC%8Cbash%20%E5%A6%82%E4%BD%95%E6%8F%90%E5%8F%96%E7%AD%89%E5%8F%B7%E5%90%8E%E7%9A%84%E5%91%BD%E5%90%8D%E5%80%BC%EF%BC%9F.png)
这个问题 (如何获取等号后的值)基本上就是我想要的:
给定一行文本,带有类似语法的命名参数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
。