Bash 배열 및 출력

Bash 배열 및 출력

내 스크립트 출력의 일부에서 tmp로 폴더가 있습니다. 필요하지 않은 부분을 제거하려면 회전 컷이 필요합니다. 배열을 사용하고 있는 스크립트의 일부에 각 줄을 개별적으로 출력하고 싶습니다. ${myarray[0]}에서와 같이 []에 넣으면 첫 번째 줄 2번째 등을 출력하도록 할 수 있습니다. 나에게 정말로 필요한 것은 파일의 각 줄에 대해 이 섹션을 채우는 것입니다.

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>

관련 정보