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/defsed '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
相关产品推荐
相关产品推荐

