Extraindo partes do nome do arquivo

2

Estou tentando usar uma parte do nome do arquivo a ser inserido em um novo arquivo criado usando o script. Por exemplo: dcn_2014_01_31_14_17_45_505.pcap e dcn_2014_01_31_14_32_27_656.pcap devem dar 2014_0131_1417_to_1432_utc.pcap . Eu posso conseguir até dcn_2014_01_31_14_17_45_505_to_dcn_2014_01_31_14_32_27_656.pcap . Como faço para selecionar cada número para obter a saída desejada? Eu usei o seguinte script:

TAG1=$(basename ${FILES[0]} | sed 's/.pcap//')
TAG2=$(basename ${FILES[$N-1]} | sed 's/.pcap//')

#merge the files
mergecap -w /mnt/md0/capture/DCN/"${TAG1}_to_${TAG2}".pcap ${FILES[@]}

Onde FILES [] é uma matriz de 15 arquivos.

    
por Jishnu U Nair 31.01.2014 / 16:14

2 respostas

1

Para versões modernas de bash , você pode usar uma matriz para armazenar as diferentes partes do nome do arquivo. Algo como:

TAG1=( $(basename "${FILES[0]}" | sed 's/_/ /g') )
TAG2=( $(basename "${FILES[$N-1]}" | sed 's/_/ /g') )

range="${TAG1[1]}_${TAG1[2]}${TAG1[3]}_${TAG1[4]}${TAG1[5]}_to_${TAG2[4]}${TAG2[5]}"

echo "$range"
#mergecap -w /mnt/md0/capture/DCN/"$range"_utc.pcap ${FILES[@]}

Você também pode usar o bash para obter o nome de base e fazer a substituição:

TAG1="${FILES[0]##*/}"
TAG1=( ${TAG1//_/ } )
TAG2="${FILES[$N-1]##*/}"
TAG2=( ${TAG2//_/ } )
    
por 31.01.2014 / 19:29
0

Esse tipo de coisa é mais fácil de fazer com o regex e as capturas do Perl:

$filename =~ /dcn_(\d{4})_(\d{2})_(\d{2})_(\d{2})_(\d{2}).*\.pcap/;
my $year = $1;
my $month = $2;
my $day = $3;
my $hour = $4;
my $minute = $5;

Depois, você faz o mesmo para o outro arquivo e formata o nome do arquivo de saída da maneira que quiser.

    
por 31.01.2014 / 16:26