使用sed提取文本并处理可能存在的空格问题
我懂你现在的痛点——想用whereis提取命令的手册页目录,还得搞定路径里可能藏着的空格,这在脚本里确实容易踩坑。我给你几个实用的方案,不管路径有没有空格都能正常工作:
方案1:用whereis -m精准定位手册页路径
whereis的-m选项可以只输出手册页相关的内容,省得你去过滤二进制或源码路径。再配合-f选项,能直接去掉开头的命令名,只留路径:
# 获取所有手册页路径(自动跳过命令名) man_paths=$(whereis -m -f your_command) # 提取第一个手册页路径(处理空格的关键是用双引号包裹) # 如果路径里有空格,我们可以用Python帮忙解析(安全且简单) first_man_path=$(echo "$man_paths" | python -c "import sys; print(sys.stdin.readline().split()[0])") # 提取目录部分 man_dir=$(dirname "$first_man_path") # 输出结果 echo "$man_dir"
这个方案用Python来处理带空格的路径拆分,比纯shell更可靠,不用担心空格把路径拆碎。
方案2:纯Shell实现(适合不能用Python的环境)
如果你的环境没有Python,我们可以用正则匹配来提取第一个包含man的路径,即使路径里有空格:
# 获取whereis的完整输出 output=$(whereis your_command) # 去掉开头的命令名和冒号,只留路径部分 paths=${output#*: } # 用sed匹配第一个以/开头、包含man的完整路径(直到下一个路径的起始/之前) first_man_path=$(echo "$paths" | sed -E 's/^(\/.*man.*?)( |$).*/\1/') # 提取目录 man_dir=$(dirname "$first_man_path") echo "$man_dir"
这个正则会匹配从第一个/开始,到第一个空格(或行尾)结束的内容,同时确保路径里包含man——不过要注意,如果路径里的空格后面刚好也是/(比如两个手册页路径连在一起),这个方法会更准确。
小提示
如果路径里的空格是因为自定义安装软件导致的,其实可以考虑把软件安装到不带空格的目录里,这样后续脚本处理会省心很多。但如果必须处理空格,上面两个方案都能帮你搞定。
内容的提问来源于stack exchange,提问作者Allan
相关产品推荐
相关产品推荐

