从文件名中提取数字而忽略扩展名

时间:2011-12-04 03:38:16

标签: bash sed grep file-rename

我正在编写一个脚本来重命名一些视频文件。有些名为XXX blah blah.ext,有些名为XXX - XXX blah blah.ext,其中“X”是数字。此外,有些文件是.avi,有些是mp4。我想要的是从这些文件中提取数字,如果有多个空格则用空格分隔,并忽略“.mp4”文件中的“4”。

我当前的实现是egrep -o "[[:digit:]]*",虽然这确实将数字分成不同的输出,但它也会考虑“.mp4”。

使用sed我不仅无法为每个数字生成不同的输出,还包括“4”。注意:我对sed很新,即我开始学习它是为了编写这个脚本。

我该怎么做?

3 个答案:

答案 0 :(得分:1)

for file in *
do
    echo $file | sed 's/\..*$//' | egrep -o "[[:digit:]]*"
done

答案 1 :(得分:1)

你应该发现这非常强大:

sed 's/^[^[:digit:]]*\([[:digit:]]\+\)[^[:digit:]]\+\( [[:digit:]]\+\)\?[^[:digit:]]\+[[:digit:]]\?$/\1\2/'

如果sed支持-r,则可以消除用于转义的反斜杠:

sed -r 's/^[^[:digit:]]*([[:digit:]]+)[^[:digit:]]+( [[:digit:]]+)?[^[:digit:]]+[[:digit:]]?$/\1\2/'

演示:

$ echo '123 blah blah.avi
234 blah blah.mp4
345 - 678 blah blah.avi
901 - 234 blah blah.mp4' | 
sed -r 's/^[^[:digit:]]*([[:digit:]]+)[^[:digit:]]+( [[:digit:]]+)?[^[:digit:]]+[[:digit:]]?$/\1\2/'
123
234
345 678
901 234

这取决于在第二个数字之前(当有一个数字时)文件名中有空格。如果有文件没有,那么一个简单的修改就可以使它工作。

答案 2 :(得分:0)

这可能对您有用:

# echo '123 bla bla.avi
456 - 789 bla bla.avi
012bla bla.avi
345-678blabla.avi
901 bla bla.mp4
234 - 567 bla bla.mp4
890bla bla.mp4
123 - 456 - 789 bla bla.mp4' |
sed 's/[^0-9]*[0-9]$//;s/[^0-9]\+/ /g'
123 
456 789 
012 
345 678 
901
234 567
890
123 456 789