Bash-Array und -Ausgabe

Bash-Array und -Ausgabe

Ich habe einen Ordner mit einem Teil meiner Skriptausgabe in tmp. Der Rev Cut ist notwendig, um Teile davon zu entfernen, die nicht benötigt werden. Ich möchte jede Zeile separat ausgeben. Für den Teil meines Skripts verwende ich ein Array und kann es dazu bringen, die erste Zeile, die zweite usw. auszugeben, wenn ich das in mein [] einfüge, wie in ${myarray[0]}. Was ich wirklich brauche, ist, dass dieser Abschnitt für jede Zeile der Datei ausgefüllt wird.

Der Inhalt von tmp ist wie folgt.

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

Das ist, was ich bisher habe.

#!/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

Die Ausgabe sieht so aus. und ich muss jede Zeile nacheinander mit dem Array ausfüllen. Danke

<File>20038100</File>

@roaima Danke für die Hilfe, ich weiß das wirklich zu schätzen. Ich sollte das etwas weiter ausführen, denn der schwierige Teil ist nicht, diese Ausgabe zu erhalten, sondern sie zu verwenden, um einen anderen Abschnitt des Skripts auszufüllen. Ich habe bereits ein Array, um einen Abschnitt für jede Datei im Ordner auszufüllen, aber es ist nur der Speicherort und funktioniert gut genug, wenn ich ls auf den Ordner verwende. Dadurch wird ein Teil des Skripts für jede Datei im Ordner ausgeführt. Mein Problem ist, dass ich den Inhalt des Ordners nehmen und jeden Abschnitt für jede Datei im Ordner an 4 verschiedenen Stellen ablegen muss. Es füllt eine XML-Datei aus, aus der ich einen Batch ausführen muss. Ich habe mir den Kopf darüber zerbrochen und muss es vorerst mit Bash machen, vielleicht kann ich in Zukunft Python verwenden, hoffe ich.

    while IFS=$',' read -r -a arry;
do
  echo '        <Part>
            <Input>' >> $file_out
  echo '                <File>'${arry[0]}'</File>' >> $file_out

Im folgenden Abschnitt muss ich jede Zeile aus tmp an 4 Stellen in meinem Skript für jede Zeile in tmp platzieren. Das können viele Dateien sein oder nur 1, aber ich brauche 4 Einträge in meiner XML für jede Zeile im Originalordner.

    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

Antwort1

Sie können readarraydie gesamte Eingabeschleife nutzen und vermeiden

readarray -t myarray <1.txt

Ich denke aber, dass es einfacher wäre, die Datei direkt umzuwandeln

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>

verwandte Informationen