Existem várias maneiras de fazer isso. Os seguintes comandos assumem que cada linha de entrada só pode ter um número. Estou usando este arquivo como um teste:
1844-PAL.Bak
IMG_1959.bak
ZER_1940.BAK
PEN225.bak
word-1943.BAK
-
sed
$ sed -r 's/([^0-9]*)([0-9]*)([^0-9]*)/1:"", 2:"", 3:""/' file 1:"", 2:"1844", 3:"-PAL.Bak " 1:"IMG_", 2:"1959", 3:"bak " 1:"ZER_", 2:"1940", 3:"BAK " 1:"PEN", 2:"225", 3:"bak" 1:"word-", 2:"1943", 3:"BAK"
-
perl
$ perl -lpe 's/([^\d]*)(\d*)([^\d])/1:"$1", 2:"$2", 3:"$3"/' file 1:"", 2:"1844", 3:"-"PAL.Bak 1:"IMG_", 2:"1959", 3:"."bak 1:"ZER_", 2:"1940", 3:"."BAK 1:"PEN", 2:"225", 3:"."bak 1:"word-", 2:"1943", 3:"."BAK
-
grep
$ grep -oP '\d+' file 1844 1959 1940 225 1943
Se você tiver apenas um padrão de interesse por linha, poderá simplificar para
$ sed -r 's/[^0-9]*([0-9]*).*/Matched: /' file
Matched: 1844
Matched: 1959
Matched: 1940
Matched: 225
Matched: 1943
ou
$ perl -lpe 's/.*?(\d+).*/Matched $1/' file
Matched 1844
Matched 1959
Matched 1940
Matched 225
Matched 1943
Em geral, com expressões regulares, menos é mais. Você deve sempre tentar usar a expressão regular mais simples necessária. Se você não quiser capturar ou combinar os caracteres que não são números, deixe-os fora da expressão regular.