我有一堆文件都有名字,序列号和扩展名。我想提取这个序列号和扩展名。它们看起来像这样:
photo-123.jpg
photo-456.png
photo-789.bmp
等
我想运行一个bash脚本来提取这些序列号并以这种方式将它们放在一个文件中:
123
456
789
等
请注意,并非所有照片都具有相同的扩展名(bmp
,png
,jpg
),但它们都以photo-
开头。
答案 0 :(得分:4)
您可以使用parameter substitution:
$ ls
photo-123.jpg photo-456.png photo-7832525239.bmp photo-789.bmp
$ for file in *; do
[[ -f "$file" ]] || continue
[[ $file == "num.log" ]] && continue
file=${file%.*} && echo "${file#*-}"
done > num.log
$ ls
num.log photo-123.jpg photo-456.png photo-7832525239.bmp photo-789.bmp
$ cat num.log
123
456
7832525239
789
${parameter#word}
从开始中删除最短匹配,${parameter##word}
从最长匹配>开始。相反,${parameter%word}
会从结束中移除最短匹配,而${parameter%%word}
会从移除最长匹配>端即可。
或者,如果目录中没有文件,您可以阅读nullglob而不是检查文件是否存在。 (感谢Adrian Frühwirth提供了很好的反馈)
答案 1 :(得分:2)
使用BASH正则表达式:
f='photo-123.jpg'
[[ "$f" =~ -([0-9]+)\. ]] && echo "${BASH_REMATCH[1]}"
123
针对所有匹配的文件运行它:
for f in *-[0-9]*.*; do
[[ "$f" =~ -([0-9]+)\. ]] && echo "${BASH_REMATCH[1]}"
done
答案 2 :(得分:2)
假设您只想保留所有数字而且您正在使用bash,这里有一些您可能会觉得有用的内容:
danny@machine:~$ file=abc123def.jpg
danny@machine:~$ echo ${file//[^0123456789]/}
123
danny@machine:~$ echo ${file##*.}
jpg
danny@machine:~$ echo ${file//[^0123456789]/}.${file##*.}
123.jpg
您应该能够基于此编写脚本。或者,只需删除领先的"照片 - "来自$ name使用
newname=$(name#photo-}
bash手册页Parameter Expansion部分介绍了这些和其他几个。
答案 3 :(得分:0)
或者可能有两个连续的awk调用:
ls -1 | awk -F- '{print $2}' | awk -F. '{print $1}'
答案 4 :(得分:-1)
怎么样
ls -l | awk {'print $9'} | grep -o -E '[0-9]*'
在文件所在的目录中?