Bash替换文件名的右侧部分

时间:2014-03-14 19:01:35

标签: linux bash sed file-rename

我在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/"

感谢您的帮助

2 个答案:

答案 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