У меня есть папка из части моего скрипта, выводимого в tmp. Rev cut необходим для удаления ненужных частей. Я хочу выводить каждую строку отдельно в часть моего скрипта. Я использую массив, и я могу заставить его выводить первую строку, вторую и т. д., если я помещу это в [], как в ${myarray[0]}. Что мне действительно нужно, так это заполнить этот раздел для каждой строки файла.
Содержимое tmp примерно такое.
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
Вот что у меня есть на данный момент.
#!/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
Вывод выглядит так. и мне нужно, чтобы каждая строка была заполнена последовательно с массивом. Спасибо
<File>20038100</File>
@roaima Спасибо за помощь, я действительно ценю это. Мне следует немного подробнее остановиться, потому что сложная часть не в получении этого вывода, а в использовании его для заполнения другого раздела скрипта. У меня уже есть массив для заполнения раздела для каждого файла в папке, но это просто местоположение, и он достаточно хорошо работает с использованием ls для папки. Это запускает часть скрипта для каждого файла в папке. Моя проблема в том, что мне нужно взять содержимое папки и поместить каждый раздел в 4 разных места для каждого файла в папке. Это заполнение XML-файла, из которого мне нужно запустить пакет. Я ломал голову над этим, и мне нужно сделать это с помощью Bash на данный момент, возможно, в будущем смогу перейти на Python, я надеюсь.
while IFS=$',' read -r -a arry;
do
echo ' <Part>
<Input>' >> $file_out
echo ' <File>'${arry[0]}'</File>' >> $file_out
В разделе ниже мне нужно разместить каждую строку из tmp в 4 местах моего скрипта для каждой строки в tmp. Это может быть много файлов или всего 1, но мне нужно 4 записи в моем xml для каждой строки в исходной папке.
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
решение1
Вы можете использовать readarray
и избегать всего цикла ввода
readarray -t myarray <1.txt
Но я думаю, что было бы проще преобразовать файл напрямую
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>