使用sed提取子串报错:invalid reference \1 on `s' command's RHS
解决sed提取子串时的
invalid reference \1错误并实现需求 你遇到的错误是因为sed的替换表达式里,\1引用了第一个捕获组,但你的正则表达式没有定义任何捕获组——你只是匹配了带括号的字符串,却没把要提取的部分用圆括号()括起来,导致sed找不到对应的分组引用。
修正后的sed脚本
把正则中需要提取的子串用圆括号包裹,定义为捕获组,就能正常引用\1了:
#!/bin/bash txt="[audio.sys.offload.pstimeout.secs]: [3]" echo "$txt" | sed -r -e 's/\[([a-zA-Z0-9_.]+)\].*/\1/'
关键修改点
- 将原正则
\[[a-zA-Z0-9_.]+\]改为\[([a-zA-Z0-9_.]+)\],用()把方括号内的目标子串括起来,形成第一个捕获组 - 替换规则中
\1就代表这个捕获组的内容,也就是我们需要提取的键名 - 给
echo的变量$txt加上双引号,避免字符串包含特殊字符或空格时出现意外解析问题
另一种更直观的实现(用grep)
如果只是提取括号内的内容,也可以用grep的扩展正则匹配,不需要替换操作:
echo "$txt" | grep -oP '(?<=\[)[a-zA-Z0-9_.]+(?=\])'
这里(?<=\[)是反向预查(匹配前面有[的位置),(?=\])是正向预查(匹配后面有]的位置),直接精准提取括号中间的目标子串。
内容的提问来源于stack exchange,提问作者lucky1928
相关产品推荐
相关产品推荐

