Isso funciona, embora eu não usasse o awk para isso, eu usaria o gawk, que tem alguns recursos significativos que facilitam a operação desse tipo, gensub () ..
echo 'fileLoad.xml2017-12-21_10_55_53-153.txt
otherFile.xml2017-12-20-11_23_01-87899.txt
someFile.xml2017-11-30-21_00_59-1.txt' | awk '{
gsub(/^.*\.xml|-[0-9]+\.txt/,"",$0);
date=$0;
time=$0;
sub(/[-_][0-9]{2}_[0-9]{2}_[0-9]{2}$/,"",date);
sub(/^[0-9]{4}-[0-9]{2}-[0-9]{2}[-_]/,"",time);
gsub(/_/,":",time);
print date " " time
}'
2017-12-21 10:55:53
2017-12-20 11:23:01
2017-11-30 21:00:59
Desde que você especificou awk, esta é uma maneira de fazer isso, embora um pouco básica.
Note que, devido à ausência do gensub, eu transferi o valor de $ 0 para dois titulares, para que eu pudesse retirar o começo de um e o fim do outro.
Remover as iniciais / finais iniciais é fácil, como você pode ver, e isso deixa apenas os dados de data / hora para processar ainda mais.
Usar o gawk e o gensub é mais fácil.
echo 'fileLoad.xml2017-12-21_10_55_53-153.txt
otherFile.xml2017-12-20-11_23_01-87899.txt
someFile.xml2017-11-30-21_00_59-1.txt' | gawk '{
gsub(/^.*\.xml|-[0-9]+\.txt/,"",$0);
datetime = gensub(/^([0-9-]{10})[-_]([0-9_]{8})$/,"\1 \2",1,$0);
gsub(/_/,":",datetime);
print datetime
}'
2017-12-21 10:55:53
2017-12-20 11:23:01
2017-11-30 21:00:59
Note que os padrões de início / fim fazem a mesma coisa, um pega o padrão atual e o reproduz, o segundo apenas diz, dá-me as 10 primeiras correspondências para [0-9-] e as últimas 8 combinações para [0 -9_], depende apenas de qual é mais fácil de ler.
A verdadeira questão é se você não teria sido melhor usar o Perl para esse trabalho, no entanto.