Você poderia usar o awk para isso.
1)
echo server.log.2016-03-20-14 | awk -F'[.]' '{print $3}' | awk -F'[-]' '{print $1$2$3}'
2)
echo server-2016-03-17-13-16-Restart.log | awk -F'[-]' '{print $2$3$4}'
Eu quero criar um nome de diretório extraindo partes de um nome de arquivo. Aqui estão alguns exemplos:
server.log.2016-03-20-14
→ 20160320
server-2016-03-17-13-16-Restart.log
→ 20160317
Estou usando o HP-UX.
Você pode passar o nome do arquivo para a verificação de regex, com sed:
echo server.log.2016-03-20-14 | sed 's/server\.log\.\([0-9]\{4\}\)-\([0-9]\{2\}\)-\([0-9]\{2\}\)-\([0-9]\{2\}\)//g'
echo server-2016-03-17-13-16-Restart.log | sed 's/server-\([0-9]\{4\}\)-\([0-9]\{2\}\)-\([0-9]\{2\}\)-\([0-9]\{2\}\)-\([0-9]\{2\}\)-Restart.log//g'
Se você precisar de regex mais rigoroso, por exemplo, meses podem ser descritos com regex
0[0-9]\|1[12]
e os dias são
0[1-9]\|[12][0-9]\|3[01]
Você pode fazer isso com as construções de manipulação de strings do shell. Isso requer um shell POSIX, portanto, se você estiver executando uma versão antiga do HP-UX, talvez seja necessário chamar um shell POSIX, como o ksh, em vez do shell Bourne.
Você não especificou completamente como analisar a data. Estou assumindo que a primeira correspondência de ????-??-??
, em que cada um dos ??
são dígitos, é a data que você deseja.
p=${0#*[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]}
s=${0#"$p"}; p=${0%"$p"}
p=${p#"${p%??????????}"}
year=${p%??????}; p=${p#?????}
month=${p%???}; day=${p#???}
echo "$year$month$day"
Não é o código mais legível, mas funciona.
Tags shell-script filenames string