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 readarray
e 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>