shell - 如何转义特殊字符?

标签 shell command-line sed

我正在尝试通过 bash shell for 循环删除歌曲,但删除这样的文件

while read item; do rm "$item"; done < duplicates

总是被歌名所困扰。有可能解决这个问题吗?我的歌曲标题可能如下所示:

/home/user/Music/Master List's Music/iTunes/iTunes\ Music/John\ Mayer/Room\ for\ Squares\ \[Aware\]/07\ 83.m4a
/home/user/Music/Master List's Music/bsg\ season\ 1\ \(Case\ Conflict\ 1\)/06\ A\ Good\ Lighter.mp3
/home/user/Music/Master List's Music/Nino\ Rota/The\ Godfather\ Pt.\ 3/14\ A\ Casa\ Amiche.m4a

如您所见,为了删除某个项目,我可以没有 %.()[] 或其他任何内容而不会被转义,除非它是 .显然在文件扩展名之前。有没有办法可以转义这样的特殊字符?

例如,我使用 sed 将 %20 转换为空格:

cat duplicates | sed 's/%20/\\ /g' > clean_duplicates

我正在寻找的输出如下所示:

/home/user/Music/Master\ List\'s\ Music/iTunes/iTunes Music/John\ Mayer/Room\ for\ Squares\ \[Aware\]/07\ 83.m4a
/home/user/Music/Master\ List\'s\ Music/bsg\ season\ 1\ \(Case\ Conflict\ 1\)/06\ A\ Good\ Lighter.mp3
/home/user/Music/Master\ List\'s\ Music/Nino\ Rota/The Godfather\ Pt\.\ 3\/14\ A\ Casa\ Amiche.m4a

最佳答案

更新解决实际的网址解码问题(我之前错过了):

while read line; do printf "$(echo -n $line | sed 's/\\/\\\\/g;s/\(%\)\([0-9a-fA-F][0-9a-fA-F]\)/\\x\2/g')\n"; done < input

输出:

/home/user/Music/Master List's Music/iTunes/iTunes Music/John Mayer/Room for Squares [Aware]/07 83.m4a
/home/user/Music/Master List's Music/bsg season 1 (Case Conflict 1)/06 A Good Lighter.mp3
/home/user/Music/Master List's Music/Nino Rota/The Godfather Pt. 3/14 A Casa Amiche.m4a

因此,为了删除这些文件,例如将清理后的输出重定向到文件:

while read line
do 
    printf "$(echo -n $line | sed 's/\\/\\\\/g;s/\(%\)\([0-9a-fA-F][0-9a-fA-F]\)/\\x\2/g')\n"
done < duplicates > cleaned_duplicates

while read file; do rm -v "$file"; done < cleaned_duplicates

如果您希望使用显式 shell 字符转义将名称存储到脚本文件中,您可以这样做

while read file; do printf "rm -v %q\n" "$file"; done < cleaned_duplicates > script.sh

这应该导致 script.sh 包含:

rm -v /home/user/Music/Master\ List\'s\ Music/iTunes/iTunes\ Music/John\ Mayer/R
rm -v /home/user/Music/Master\ List\'s\ Music/bsg\ season\ 1\ \(Case\ Conflict\ 
rm -v /home/user/Music/Master\ List\'s\ Music/Nino\ Rota/The\ Godfather\ Pt.\ 3/

关于shell - 如何转义特殊字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9940821/

相关文章:

linux - 查找输出流中的常见字符

python - Django shell 中的奇怪字符,箭头键不起作用

linux - 尝试使用 trap 跳出 shell 函数

google-chrome - 有没有办法在 Google Chrome 扩展中获取命令行参数?

sed 用下划线替换破折号,直到到达字符

regex - 在 bash/unix 中删除 CSV 文件所有列的空格

r - 在 VBA 中将字符列表作为参数传递给 RScript?

python - 安排自动化 shell 脚本不以 ROOT 身​​份运行

android - monkeyrunner 导入操作系统数组索引outofbounds异常

javascript - 在 node.js 中输出完整的错误对象