我想获取可变长度文件名的前缀。
In: some_filename_123-uniq.tar.gz
Out: some_filename_123
In: some_filename_1-uniq.tar.gz
Out: some_filename_1
这与我想要的完全相反-uniq.tar.gz
:
result=$(echo *-uniq.tar.gz | rev | cut -c-12 | rev)
echo $result
只会有一个-uniq.tar.gz
带后缀的项目。
我尝试使用参数替换,这似乎是最简单的方法,但出现语法错误:
${"some_filename_123-uniq.tar.gz"//"-uniq.tar.gz"}
bash: ${"some_filename_123-uniq.tar.gz"/""/"-uniq.tar.gz"}: bad substitution
答案1
我尝试使用参数替换,这似乎是最简单的方法
它是最简单的方法(只要记住,顾名思义 - 正如评论中指出的那样,shell扩展参数/变量);
用于${var%-*}
(不情愿地)删除后缀(在本例中从最后一个开始-
):
for f in ./*-uniq.tar.gz
do
printf %s\\n "${f%-*}"
done
或${var:offset:length}
删除最后一个氮字符(其中长度是负整数):
for f in ./*-uniq.tar.gz
do
printf %s\\n "${f:0:-12}"
done
答案2
这是一种快速而肮脏的方法,只需使用 sed 将该字符串替换为空(删除):
for i in *-uniq.tar.gz
do
result=$(echo $i | sed 's/-uniq.tar.gz$//')
echo "$result"
done
上面的代码将遍历一个目录,查找以 -uniq.tar.gz 结尾的任何内容,然后在删除结尾部分后回显结果。