从除文件扩展名(.png)之外的所有文件中删除_之后出现的字符

时间:2016-07-18 14:16:16

标签: regex linux shell unix sed

我正在搜索unix命令/ shell脚本,以删除除了文件扩展名之外的所有文件中_之后发生的字符。

示例:

b6d28保险更新-shop_6b5c74fa3d4b96f7557c3fd66f2555af.png

应重命名为

b6d28保险更新-shop.png

我尝试过在线搜索,但无法找到快速,最佳的解决方案。

请注意,这些额外字符会随机添加,并在每个文件中有所不同。

提前致谢!

4 个答案:

答案 0 :(得分:1)

您可以使用否定字符类来使用sed

f='b6d28-insurance-renewal-shop_6b5c74fa3d4b96f7557c3fd66f2555af.png'
sed 's/_[^_.]*//' <<< "$f"

b6d28-insurance-renewal-shop.png

[^_.]匹配除DOT或下划线之外的任何字符。

如果您正在使用bash,那么您可以使用以下命令在shell中执行此操作:

echo "${f%_*}.png"

答案 1 :(得分:0)

正则表达式:

(\_[\d\w]+)(?=(\.\w{2,3}))

在.ext [ension]

之前找到每个_akfgasfhsgfhha

答案 2 :(得分:0)

你也可以使用cut作为结果:

file="b6d28-insurance-renewal-shop_6b5c74fa3d4b96f7557c3fd66f2555af.png"
new_file=$(echo $file | cut -d'_' -f1).$(echo $file | cut -d'.' -f2)
echo "New file name: ${new_file}"

输出:

New file name: b6d28-insurance-renewal-shop.png

答案 3 :(得分:0)

假设f保存原始文件名,

 ${f%_*}.${f##*.}

会给你转换后的文件名。