正则处理本地变量:寻求替代echo管道sed的文件名处理方法
更优雅处理fish shell中文件名/变量字符串的方案
太棒了,你已经意识到用echo管道sed处理字符串有点冗余——在fish shell里确实有专门针对变量、文件名的字符串处理工具,比sed更贴合shell场景,而且效率更高!下面给你几个实用的方案:
1. Fish 内置 string 命令(最推荐)
Fish 自带的string工具就是专门为字符串操作设计的,语法直观,而且是内置命令(不需要额外启动进程),非常适合处理变量或文件名。
单个文件名处理
如果你的文件名存在变量中:
set input_file source/my_video.mp4 # 移除开头的source/前缀 set output_file (string replace '^source/' '' $input_file)
这里^source/是正则表达式,匹配开头的source/,然后替换为空字符串,精准又灵活。
批量处理文件
结合glob遍历source/目录下的所有视频文件:
for input_file in source/*.mp4 source/*.mov set output_file (string replace '^source/' '' $input_file) # 这里替换成你的编码命令,比如用ffmpeg ffmpeg -i $input_file -c:v libx264 $output_file end
2. Fish 参数扩展(轻量快捷)
Fish 支持类似bash的参数扩展语法,对于简单的前缀移除场景,用这个方式最简洁:
set input_file source/my_video.mp4 # 移除开头的source/前缀(#表示匹配最短前缀) set output_file ${input_file#source/}
如果需要匹配更复杂的前缀(比如多个可能的目录前缀),还可以用通配符:
# 移除开头任意以/结尾的目录前缀(比如source/或者assets/) set output_file ${input_file#*/}
3. basename 命令(适合简单场景)
如果你的视频文件都直接放在source/根目录下(没有子目录),用basename也能快速获取不带前缀的文件名:
set input_file source/my_video.mp4 set output_file (basename $input_file)
⚠️ 注意:这个方式只适合单一目录的情况,如果文件在source/sub/这类子目录中,basename会直接去掉所有路径,只保留文件名,不符合需求。
总结
优先推荐用Fish内置的string命令或者参数扩展,它们比echo | sed更高效(内置命令无进程开销),语法也更贴合shell中变量/文件名的处理场景,代码可读性更高。
内容的提问来源于stack exchange,提问作者Exercise To The Reader
相关产品推荐
相关产品推荐

