Bash 配列と出力

Bash 配列と出力

スクリプト出力の一部から tmp へのフォルダーがあります。rev cut は、不要な部分を削除するために必要です。スクリプトの各行を個別に出力したいのですが、配列を使用しており、${myarray[0]} のように [] に入れると、1 行目、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 の各行をスクリプト内の 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>

関連情報