Matriz Bash e saída

Matriz Bash e saída

Eu tenho uma pasta de parte da saída do meu script para tmp. O corte rev é necessário para remover partes desnecessárias. Quero gerar cada linha separadamente para parte do meu script. Estou usando um array e posso fazer com que ele produza a primeira linha, 2ª etc. se eu colocar isso em meu [] como em ${myarray[0]}. O que eu realmente preciso é preencher esta seção para cada linha do arquivo.

O conteúdo do tmp é assim.

C:\xxxx\DXF FILES\20038100.SLDPRT
C:\xxxx\DXF FILES\20136210.SLDPRT
C:\xxxx\DXF FILES\4_2-1.igs
C:\xxxx\DXF FILES\KC900.igs
C:\xxxx\DXF FILES\MetalSheet_Pusher.step
C:\xxxx\DXF FILES\Sheet Metal Part 8.igs

Isso é o que tenho até agora.

#!/bin/bash

set -x
cat tmp | rev | cut -d"\\" -f1 | rev | cut -d '.' -f1 > 1.txt
    declare -a myarray
let i=0
while IFS=$'\n' read -r line_data; do
        myarray[i]="${line_data}"
        ((++i))
done < 1.txt
echo "<File>"${myarray[0]}"</File>" > out.txt
rm 1.txt

A saída é semelhante a esta. e preciso que cada linha seja preenchida em sucessão com o array. Obrigado

<File>20038100</File>

@roaima Obrigado pela ajuda, agradeço muito. Devo elaborar um pouco mais porque a parte difícil não é obter essa saída, mas usá-la para preencher outra seção do script. Já tenho um array para preencher uma seção para cada arquivo da pasta, mas é apenas o local e funciona bem usando ls na pasta. Isso executa parte do script para cada arquivo na pasta. Meu problema é que preciso pegar o conteúdo da pasta e colocar cada seção em 4 locais diferentes para cada arquivo da pasta. Ele está preenchendo um arquivo xml do qual preciso executar um lote. Estou coçando a cabeça com isso e preciso fazer isso com o Bash por enquanto, talvez consiga usar o Python no futuro, espero.

    while IFS=$',' read -r -a arry;
do
  echo '        <Part>
            <Input>' >> $file_out
  echo '                <File>'${arry[0]}'</File>' >> $file_out

A seção abaixo é onde preciso colocar cada linha do tmp em 4 lugares no meu script para cada linha do tmp. Podem ser muitos arquivos ou apenas 1, mas preciso de 4 entradas em meu xml para cada linha da pasta original.

    cat tmp | rev | cut -d"\\" -f1 | rev | cut -d '.' -f1 > 1
   declare -a myarray
   let i=0
        while IFS=$'\n' read -r line_data; do
        myarray[i]="${line_data}"
        ((++i))
        done < 1
echo '                  <File>'${myarray[0]}'</File>
                        </NCFile>
                        <Graphics>
                            <Save>true</Save>
                                <Directory>C:\xxxx\OUTPUT\NC FILES</Directory>
                                <File>'${myarray[0]}'</File>
                        </Graphics>
                        <FlatPatternDXF>
                                <Save>true</Save>
                                <Directory>C:\xxxx\OUTPUT\DXF FILES</Directory>
                                <DXFSetting>xxxx</DXFSetting>
                                <File>'${myarray[0]}'</File>
                        </FlatPatternDXF>
                        <xxxxile>
                                <Save>true</Save>
                                <Directory>C:\xxxx\OUTPUT\xxxx FILES</Directory>
                        <File>'${myarray[0]}'</File>
                        </xxxxFile>
                        <ProcessDocumentation>
                            <Save>true</Save>
                                <Directory>C:\xxxx\OUTPUT\PDF FILES</Directory>
                                <File>'${myarray[0]}'</File>
                        </ProcessDocumentation>
                </SaveSettings>
                </Input>' >> $file_out

Responder1

Você pode usar readarraye evitar todo o loop de entrada

readarray -t myarray <1.txt

Mas acho que seria mais fácil transformar o arquivo diretamente

sed -E 's!^.*[\\.]([^.]+)\..*!<File>\1</File>!' tmp >out.txt

cat out.txt
<File>20038100</File>
<File>20136210</File>
<File>4_2-1</File>
<File>KC900</File>
<File>MetalSheet_Pusher</File>
<File>Sheet Metal Part 8</File>

informação relacionada