我正在编写一个脚本来重命名一些视频文件。有些名为XXX blah blah.ext
,有些名为XXX - XXX blah blah.ext
,其中“X”是数字。此外,有些文件是.avi,有些是mp4。我想要的是从这些文件中提取数字,如果有多个空格则用空格分隔,并忽略“.mp4”文件中的“4”。
我当前的实现是egrep -o "[[:digit:]]*"
,虽然这确实将数字分成不同的输出,但它也会考虑“.mp4”。
使用sed我不仅无法为每个数字生成不同的输出,还包括“4”。注意:我对sed很新,即我开始学习它是为了编写这个脚本。
我该怎么做?
答案 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