Bash 배열 및 출력

Bash 배열 및 출력

스크립트의 일부를 tmp로 출력하는 폴더가 있습니다. 원하지 않는 부분을 제거하려면 속도 감소가 필요합니다. 배열을 사용하는 스크립트의 일부에 각 줄을 개별적으로 출력하고 싶습니다. [](예: ${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의 각 줄을 tmp의 각 줄에 넣어야 하는 스크립트의 4개 위치입니다. 파일은 많을 수도 있고 1개일 수도 있지만 원본 폴더의 각 행에 대해 xml에 4개의 항목을 추가해야 합니다.

    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>

관련 정보