如何用sed提取左括号前的单词(支持括号前有无空格)
解决sed提取括号前单词(支持括号前有无空格)的问题
你的问题在于原表达式里的 \(.*\)强制要求单词和(之间不能有空格——当两者之间存在空格时,.*会把空格也包含进捕获范围,导致无法匹配到(,最终捕获组为空。
要同时兼容单词与左括号之间有空格/无空格的情况,你可以调整正则规则,让括号前的空格变为可选,同时精准锁定目标单词:
sed 's/.* \([^ ]*\) *(.*)/\1/'
表达式逻辑拆解:
.*:匹配到最后一个空格之前的所有内容(比如void fun ()里的void)\([^ ]*\):捕获不含空格的连续字符序列(也就是我们要提取的单词,比如fun),用[^ ]*确保不会把单词后面的空格误包含进来*:匹配0个或多个空格(这是实现“有无空格都兼容”的核心)(.*:匹配左括号及后面的所有内容
测试验证:
- 单词与括号无空格的场景:
echo "void fun()" | sed 's/.* \([^ ]*\) *(.*)/\1/'
输出:fun
- 单词与括号有空格的场景:
echo "void fun ()" | sed 's/.* \([^ ]*\) *(.*)/\1/'
输出:fun
- 单词前后有多个空格的场景:
echo "void fun ()" | sed 's/.* \([^ ]*\) *(.*)/\1/'
输出:fun
如果你的sed版本支持扩展正则(比如GNU sed),还可以用更简洁的写法(加-E参数省去转义符):
sed -E 's/.* ([^ ]*) *(.*)/\1/'
内容的提问来源于stack exchange,提问作者Equation Solver
相关产品推荐
相关产品推荐

