sed:仅替换字符串指定部分空格为下划线的实现问题
嘿,这个问题我刚好碰到过!要保留编号后的第一个空格,把其他空格全换成下划线,用sed其实有个很巧妙的小技巧,或者用awk也能轻松搞定,给你两种方案参考:
方案一:用sed多步替换实现
核心思路是先把第一个空格临时替换成特殊字符,处理完其他空格后再复原,完美避开第一个空格:
sed -e 's/ /@/' -e 's/ /_/g' -e 's/@/ /' your_playlist.txt
- 第一步
's/ /@/':只替换第一个空格为@(选一个文件名里不会出现的字符就行,比如@、#都可以) - 第二步
's/ /_/g':把剩下的所有空格统一替换成下划线 - 第三步
's/@/ /':把临时替换的@换回空格,这样就精准保留了编号后的那个空格
测试你的示例文件名:
原文件名:1003 James Brown - The Boss Unknown Artist.mp3
处理后:1003 James_Brown_-_The_Boss_Unknown_Artist.mp3
完全符合需求!
方案二:用awk更直观处理
awk的字段分割特性刚好适配这种场景,直接把编号单独分离出来处理,逻辑更清晰:
awk '{ # 保存第一个字段(歌曲编号) num = $1 # 清空第一个字段,剩下的就是歌曲名称部分 $1 = "" # 把名称里的所有空格替换成下划线 gsub(/ /, "_") # 打印编号+空格+处理后的名称(substr去掉开头多余的空格) printf "%s %s\n", num, substr($0, 2) }' your_playlist.txt
如果后期需要调整文件名规则,awk的写法也更容易修改。
内容的提问来源于stack exchange,提问作者Jürgen Simon
相关产品推荐
相关产品推荐

