You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

sed非贪婪匹配问题:如何在Bash中解析PHP extension_dir路径

提取PHP extension_dir的第一个路径

首先咱们先理清问题根源:php -i输出的extension_dir行通常是这种格式:

extension_dir => /some/path/php/extensions/no-debug-non-zts-20160303 => /another/possible/path

这是因为PHP会同时显示本地配置值(第一个路径)和主配置值(第二个路径)。你之前的命令之所以出现多余内容,大概率是两个原因:

  1. grep extension_dir没有精确匹配行,可能抓到了其他包含该字符串的无关内容
  2. 两次sed的组合处理不够严谨,比如行内空格不一致时,替换规则容易失效

下面给你几个更可靠的解决方案:

方法1:用awk(最简单直观)

awk天生擅长按字段分割文本,直接定位到我们要的第一个路径:

php -i | awk '/^extension_dir/ {print $3}'
  • /^extension_dir/:只匹配以extension_dir开头的行,彻底避免无关行干扰
  • print $3:该行的第三个字段就是第一个路径(默认按空格分割,第二个字段是=>)

方法2:用sed精确捕获路径

如果偏好sed,可以用捕获组精准提取目标内容:

php -i | grep '^extension_dir' | sed 's/^extension_dir => \(.*\) => .*/\1/'
  • ^extension_dir:锁定目标配置行
  • \(.*\):捕获第一个=>和第二个=>之间的内容(也就是我们要的第一个路径)
  • \1:引用捕获到的内容作为最终输出

方法3:用cut快速分割

cut适合简单的字段分割场景,操作更轻量化:

php -i | grep '^extension_dir' | cut -d' ' -f3
  • -d' ':指定空格为字段分隔符
  • -f3:直接提取第三个字段,也就是第一个路径

补充:为什么你的原命令会出问题?

如果grep没加^限制,很可能匹配到其他包含extension_dir的行,导致输出混入多余内容。另外,sed的s/=> .*//g是贪婪匹配,理论上会删掉第一个=>之后的所有内容,但如果行内有特殊字符或空格不规范,就容易出现异常——相比之下,awk或cut的字段分割逻辑要稳定得多。

内容的提问来源于stack exchange,提问作者simPod

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:43:30