关于正则表达式:在字符串扩展名之前删除下划线

Remove underscore before extension in strings

我有像tran_crossings_exp_.txttran_buildings_exp_.shp这样的字符串
如何编写一个bash函数来测试点扩展前的最后一个字符是否以下划线开头,并将下划线替换为tran_crossings_exp.txt这样的名称我知道如何在bash中获取文件的基本名称和扩展名

我已经完成了这个解决方案,但我正在寻找一种更优雅的方式,它也检查文件是否确实有下划线,如果名称已经正确则跳过它。

1
for file in `ls *_.*`;do ext="${file##*.}"; filename="${file%.*}";non=${file::-5}; mv ${file} ${non}.${ext};done


试试这个:

1
2
3
4
5
6
7
8
9
#!/bin/bash

filename=tran_crossings_exp_.txt
i=${filename:${#filename}-5:1}  // Take the 5th char from back
if [ $i ="_" ]; then           // If it is an underscore
    echo"${filename/?./.}"     // Replace '?.' with just '.', this removes last '_' in this case (? means any character)
else
    echo $filename
fi

在这里你可以测试它

注意:这仅适用于.abc(点和3个字符)扩展

编辑

存储在同一个变量中

1
2
3
4
5
6
7
8
9
10
#!/bin/bash

filename=tran_crossings_exp_.txt
i=${filename:${#filename}-5:1}

if [ $i ="_" ]; then
    filename="$(echo ${filename/?./.})"
fi

echo"$filename"