【问题标题】:Remove underscore before extension in strings删除字符串扩展前的下划线
【发布时间】:2018-05-18 21:43:41
【问题描述】:
我有 tran_crossings_exp_.txt 和 tran_buildings_exp_.shp 这样的字符串
如何编写一个 bash 函数来测试点扩展名之前的最后一个字符是否以下划线开头并将下划线替换为具有类似 tran_crossings_exp.txt 的名称我知道如何在 bash 中获取文件的基本名称和扩展名
我已经完成了这个解决方案,但我正在寻找一种更优雅的方式来检查文件是否确实有下划线,如果名称已经正确则跳过它。
for file in `ls *_.*`;do ext="${file##*.}"; filename="${file%.*}";non=${file::-5}; mv ${file} ${non}.${ext};done
【问题讨论】:
标签:
regex
bash
sed
rename
【解决方案1】:
如果文件只有一个点 (.) 和任何扩展名,则此方法有效。
它使用字符串替换。
一个衬线来查看删除下划线的结果:
find . -name "*_.*" | while IFS= read -r file; do echo "${file//_./.}"; done
解释:首先只查找那些有下划线后跟点,然后是一些扩展名的文件。然后使用字符串替换将_.改为仅.
要重命名:
find . -name "*_.*" | while IFS= read -r file;
do
mv "$file" "${file//_./.}"
done
【解决方案2】:
试试这个:
#!/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
Here你可以测试一下
注意:这仅适用于 .abc(点和 3 个字符)扩展名
编辑
存储在同一个变量中
#!/bin/bash
filename=tran_crossings_exp_.txt
i=${filename:${#filename}-5:1}
if [ $i = "_" ]; then
filename="$(echo ${filename/?./.})"
fi
echo "$filename"