说我有一个字符串文件名aa.bb.cc.xx.txt
我想删除之间的第一个内容。和。 (删除.xx)在.txt之前有aa.bb.cc.txt
。在第一次从右到左删除模式在文件名称在打击
我不想用转,切转,因为这使用3个命令
echo 'aa.bb.cc.xx.rpm' |rev | cut -d '.' --complement -s -f 2 |rev
是否存在被使用bash任何更好的解决方案? 感谢
说我有一个字符串文件名aa.bb.cc.xx.txt
我想删除之间的第一个内容。和。 (删除.xx)在.txt之前有aa.bb.cc.txt
。在第一次从右到左删除模式在文件名称在打击
我不想用转,切转,因为这使用3个命令
echo 'aa.bb.cc.xx.rpm' |rev | cut -d '.' --complement -s -f 2 |rev
是否存在被使用bash任何更好的解决方案? 感谢
如果你知道有.txt
文件结束,你可以删除为好,然后把它放回。
$ oldname=aa.bb.cc.xx.txt
$ echo "${oldname%.*.txt}.txt"
aa.bb.cc.txt
%.*.txt
去除最短字符串匹配的图案.*.txt
(在这种情况下,.xx.txt
)。
如果扩展名可以是任意字符串,您可以通过删除所有但扩展名为作为前缀,然后恢复它来保存它。
$ echo "${oldname%.*.*}.${oldname##*.}"
##*.
消除在.
结束最长前缀匹配,在这种情况下aa.bb.cc.xx.
。两个运营商都要求删除分隔匹配的前缀或后缀的.
,这就是为什么您需要在两次扩展之间明确地添加它。
您可以使用sed
如下:
$ echo "aa.bb.cc.xx.txt" | sed "s/.[a-zA-Z].txt/txt/g"
aa.bb.cc.txt
如果你想要一个普通sed
的解决方案,在任何扩建工程,你可以这样做:
$ echo 'aa.bb.cc.xx.rpm' | sed 's/[^.]*\.\([^.]*\)$/\1/'
aa.bb.cc.rpm