我有一堆文件,都有一个名称和一个序列号和一个扩展名。 我想提取这个序列号和扩展名。 他们看起来像这样:
photo-123.jpg photo-456.png photo-789.bmp
等等
我想运行一个bash脚本来提取这些序列号,并以这种方式将它们放在一个文件中:
123 456 789
等等
请注意,并非所有的照片都有相同的扩展名( bmp
, png
, jpg
),但都是以photo-
开头的。
您可以使用参数替换 :
$ 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而不是在目录中没有文件的情况下检查是否存在文件。 (感谢AdrianFrühwirth提供了很好的反馈)
使用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
假设你只是想保留所有的数字,而你正在使用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中删除前面的“photo-”即可
newname=$(name#photo-}
这些和其他几个在bash手册页的参数扩展部分中进行了解释。
或者可能连续两次awk调用:
ls -1 | awk -F- '{print $2}' | awk -F. '{print $1}'
怎么样
ls -l | awk {'print $9'} | grep -o -E '[0-9]*'
在文件所在的目录中?