求助:编写Shell脚本替换Flutter项目路径中的文件名为**
解决方法与完整脚本
1. 你的sed命令失效原因
你使用的sed "/(?<=\/)[^\/]+(?=\.dart)/g"存在两个核心问题:
- sed默认采用基础正则表达式(BRE),不支持PCRE语法中的正向/反向预查(
(?<=)、(?=)) - 命令格式错误:sed的替换操作需要使用
s/匹配模式/替换内容/结构,而非直接写正则匹配
如果要提取test/holas.dart中的holas,可以用以下两种简洁方式:
方式1:sed启用扩展正则实现
echo "test/holas.dart" | sed -E 's/.*\/([^\/]+)\.dart/\1/'
-E:启用扩展正则,避免对括号转义.*\/:匹配最后一个/之前的所有内容([^\/]+):捕获最后一个/到.dart之间的非/字符(即目标文件名)\1:引用捕获到的文件名部分
方式2:用basename工具更直观
basename "test/holas.dart" .dart
这是专门处理文件名的原生工具,直接输出holas。
2. 完整脚本:替换路径中文件名为**
需求是将任意.dart路径里的文件名(不含后缀)替换为**,例如prueba/de/una/ruta/main.dart → prueba/de/una/ruta/**.dart,以下是两种实现方案:
方案1:sed单命令实现(兼容多数Shell)
#!/bin/bash # 单个路径处理示例 target_path="prueba/de/una/ruta/main.dart" result=$(echo "$target_path" | sed -E 's/([^\/]+)\.dart/**.dart/') echo "$result" # 批量处理目录下所有.dart文件路径示例 for file in ./lib/**/*.dart; do modified_path=$(echo "$file" | sed -E 's/([^\/]+)\.dart/**.dart/') echo "$modified_path" done
方案2:Bash原生字符串操作(无外部依赖,效率更高)
#!/bin/bash # 单个路径处理示例 target_path="prueba/de/una/ruta/main.dart" # 提取目录部分:删除最后一个/及其后面的内容 dir_section="${target_path%/*}" # 拼接新路径 result="${dir_section}/**.dart" echo "$result" # 批量处理目录下所有.dart文件路径示例 for file in ./lib/**/*.dart; do dir_part="${file%/*}" echo "${dir_part}/**.dart" done
3. 效果验证
输入:test/holas.dart
输出:test/**.dart
输入:prueba/de/una/ruta/main.dart
输出:prueba/de/una/ruta/**.dart
内容的提问来源于stack exchange,提问作者Jozek Hajduk
相关产品推荐
相关产品推荐

