我在bash中重命名文件名时遇到了麻烦。
我的文件名模式是这样的:
“sometext pattern trashtext.ext”
我想保留一些文字,用其他东西替换模式和垃圾文本。 sometext具有可变长度并且可以包含空格,模式是唯一的,并且trashtext具有可变长度并且可以包含特殊的字符,例如'[',它们用sed处理得很好。 “sometext pattern trashtext.ext”=> “sometext myplaceplacement”
我找到了解决方案,但我想有更好的方法: 摆脱trashtext中的特殊字符:
rename 'y/\[/ /' *.ext
获取要删除的部分:
var=$(ls | grep -Po 'pattern[^/]+')
用sed:
删除它sed "s/$var/blabla/"
感谢您的帮助
答案 0 :(得分:1)
使用bash parameter expansion
f="sometext pattern trashtext.ext"
prefix=${f%% pattern*}
ext=${f##*.}
echo $prefix.$ext
sometext.ext
答案 1 :(得分:1)
试试这样:
pattern=somepattern
replacement=somereplacement
ext=ext
rename "s/$pattern.*?\.$ext$/$replacement.$ext/" *.$ext
.*?
应与您的" trashtext"匹配在图案和延伸之间,并用更换替换它。如果trashtext包含特殊字符,则无关紧要。
如果替换你想要使用模式匹配的任何东西,你可以这样做:
rename "s/($pattern).*?\.$ext$/\$1.$ext/" *.$ext
最后,在播放语法时最好使用-n
标志。这样命令就会显示它会做什么而不是真正做到:
rename -n "s/($pattern).*?\.$ext$/\$1.$ext/" *.$ext