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

OpenWRT ash环境下无需Perl实现grep非贪婪解析提取目录

解决OpenWRT ash中无法使用非贪婪正则提取前两级目录的问题

在OpenWRT的ash shell环境下,busybox自带的grep确实不支持Perl风格的非贪婪匹配?,所以你原来的正则表达式会失效。这里有几个无需依赖Perl扩展的替代方案,都能完美提取路径的前两级目录:

方案1:使用sed的基本正则表达式(最接近原正则思路)

利用[^\/]匹配非斜杠字符,精准定位到前两级目录的结尾,避免贪婪匹配的问题:

var2=$(echo "$TR_TORRENT_DIR" | sed -n 's/^\(\/[^\/]*\/[^\/]*\/\).*/\1/p')
echo "$var2"

解释:

  • ^:匹配字符串开头,确保从根目录开始
  • \/[^\/]*\/[^\/]*\/:匹配/一级目录/二级目录/的结构,[^\/]*表示匹配任意非斜杠字符,刚好停在下一个斜杠前
  • \( ... \):捕获目标部分,替换时保留这部分内容
  • -n和p:只打印匹配并替换后的结果

方案2:使用cut分割路径(简单直观)

通过cut按斜杠分割路径,取前3个字段(因为根路径分割后第一个字段是空),再补全结尾的斜杠:

var2=$(echo "$TR_TORRENT_DIR" | cut -d'/' -f1-3 | sed 's/$/\//')
echo "$var2"

解释:

  • cut -d'/' -f1-3:把路径按/分割,取第1到第3个字段,比如/abc/def/ghi会被分割为''、abc、def、ghi,取前3个得到/abc/def
  • sed 's/$/\//':给结果加上结尾的斜杠,和原正则输出格式一致

方案3:纯Shell参数替换/数组(无需外部命令,性能最优)

利用Shell内置的字符串处理或数组功能,完全不需要调用外部工具,适合资源有限的OpenWRT设备:

# 方法A:字符串参数替换
path="$TR_TORRENT_DIR"
# 确保路径以/开头
path="/${path#/}"
# 提取前两级目录
var2="/$(echo "$path" | cut -d'/' -f1-2)/"

# 方法B:数组分割
IFS='/' read -ra path_parts <<< "$TR_TORRENT_DIR"
var2="/${path_parts[1]}/${path_parts[2]}/"
echo "$var2"

解释:

  • 数组方法中,IFS='/'设置分割符为斜杠,read -ra把路径读入数组path_parts,比如/abc/def/ghi的数组元素是''、abc、def、ghi,直接取第1和第2个元素拼接即可

这几个方案都能在ash环境下正常工作,你可以根据自己的习惯选择最顺手的一种。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:26:00