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 readarray
die 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>