1

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

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

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

我怎样才能做到这一点?

4

3 回答 3

1
for file in *
do
    echo $file | sed 's/\..*$//' | egrep -o "[[:digit:]]*"
done
于 2011-12-04T03:41:42.437 回答
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

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

于 2011-12-04T06:04:38.913 回答
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
于 2011-12-04T06:29:48.920 回答