Tengo una carpeta de parte de la salida de mi script a tmp. El corte de revoluciones es necesario para eliminar partes del mismo que no son necesarias. Quiero generar cada línea por separado como parte de mi script. Estoy usando una matriz y puedo hacer que genere la primera línea, segunda, etc. si lo pongo en mi [] como en ${myarray[0]}. Lo que realmente necesito es completar esta sección para cada línea del archivo.
El contenido de tmp es así.
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
Esto es lo que tengo hasta ahora.
#!/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
La salida se ve así. y necesito que cada línea se complete en sucesión con la matriz. Gracias
<File>20038100</File>
@roaima Gracias por la ayuda, realmente lo aprecio. Debería elaborar un poco más porque la parte difícil no es obtener este resultado sino usarlo para completar otra sección del guión. Ya tengo una matriz para completar una sección para cada archivo en la carpeta, pero es solo la ubicación y funciona bastante bien usando ls en la carpeta. Esto ejecuta parte del script para cada archivo de la carpeta. Mi problema es que necesito tomar el contenido de la carpeta y colocar cada sección en 4 lugares diferentes para cada archivo de la carpeta. Está completando un archivo xml desde el que necesito ejecutar un lote. Me he estado rascando la cabeza con esto y necesito hacerlo con Bash por ahora, espero poder usar Python en el futuro.
while IFS=$',' read -r -a arry;
do
echo ' <Part>
<Input>' >> $file_out
echo ' <File>'${arry[0]}'</File>' >> $file_out
La siguiente sección es donde necesito colocar cada línea de tmp en 4 lugares de mi script para cada línea en tmp. Pueden ser muchos archivos o tan solo 1, pero necesito 4 entradas en mi xml para cada línea de la carpeta 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
Respuesta1
Puedes usar readarray
y evitar todo el bucle de entrada.
readarray -t myarray <1.txt
Pero creo que sería más fácil transformar el archivo directamente.
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>