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ファイルを入力しています。私はこれについて頭を傷つけていました。

    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>

おすすめ記事