Echo-Variable in Datei ohne neue Zeilen

397
Ninsto

Ich möchte neue Zeilen in Echo loswerden und dann eine Datei mit ihnen ergänzen.

files=$(cat ./Temp/files.txt) prefixedfiles=$(cat ./Temp/prefixedfiles.txt) echo "$files" >> generatedscript sed -e 's/^/ffmpeg -i /' generatedscript >> generatedscript2 sed 's/$/ -vcodec libx264 -acodec copy -threads 10 -crf 18 /' >>  generatedscript2 echo "$prefixedfiles" > generatedscript3 

ZB files.txt

./Testing/blank.mp4 ./More Testing/Test.mkv 

ZB prefixedfiles.txt

../Encoded/Testing/blank.mp4 ../Encoded/More Testing/Test.mkv 

Erwartete Ausgabe: generatedscript3

ffmpeg -i ./Testing/blank.mp4 -vcodec libx264 -acodec copy -threads 10 -crf 18 ../Encoded/More Testing/blank.mp4 ffmpeg -i ./More Testing/Test.mkv -vcodec libx264 -acodec copy -threads 10 -crf 18 ../Encoded/More Testing/Test.mkv 
0
Es gibt logische Fehler in Ihrem Skript (das Entfernen neuer Zeilen kann mit echo -n erfolgen, aber ich glaube nicht, dass dies Ihnen helfen wird). Warum haben Sie sowohl files.txt als auch prefixedfiles.txt, und nicht nur eine einzige Datei mit Separation, falls erforderlich? Wird sich der Pfad in prefixedfiles.txt auf Dateibasis ändern? Was glaubst du, was die zweite Zeile versucht? (Ich stelle diese Fragen, weil ich vermute, dass die Art und Weise, wie Sie versuchen, das Skript zu erstellen, nicht praktikabel ist - Sie müssen wahrscheinlich $ -Dateien zeilenweise iterieren. Es macht keinen Sinn, das Skript zu schreiben, bis ich die Einschränkungen verstanden habe. davidgo vor 7 Jahren 0
1. Der Grund für die Trennung der 2 liegt darin, dass "-vcodec libx264 -acodec copy -threads 10 -crf 18" in der Mitte der 2 hinzugefügt werden kann. Ich muss die für jede Zeile erforderliche Anzahl von Zeichen notieren lege es mit sed in die Mitte. Ninsto vor 7 Jahren 0
2. Ja außer "../Encoded" Ninsto vor 7 Jahren 0
3. Ich gehe davon aus, dass Sie "sed -es / ^ / ffmpeg -i / 'generatedscript >> generatedscript2" meinen, es fügt ffmpeg -i vor jeder Zeile hinzu, um ffmpeg mitzuteilen, dass es sich um die Eingabe handelt. Wenn Sie über "prefixedfiles = $ (cat ./Temp/prefixedfiles.txt)" sprechen, handelt es sich vermutlich um eine Variable, die bash auslesen kann, da cat einfach in eine neue Zeile ausgegeben wird. Ninsto vor 7 Jahren 0
bash = Echo in 3. Ninsto vor 7 Jahren 0
Übrigens werden prefixedfiles.txt und files.txt separat generiert. Ich habe mein gesamtes Skript nicht hinzugefügt. Das gesamte Skript ist [hier] (https://raw.githubusercontent.com/Ninsto/FFmpegScripts/master/copythenencode). Ninsto vor 7 Jahren 0

1 Antwort auf die Frage

0
davidgo

Meiner Meinung nach ist die Logik des von Ihnen bereitgestellten Skripts fehlerhaft - insbesondere sehe ich nicht, wie sed die 2 Eingabedateien pro Zeile kombinieren kann (ich glaube nicht, dass es so funktioniert, wie Sie denken es tut)

Ich habe eine alternative Lösung für Sie gefunden -

#! /bin/bash  export IFS=$'\n'  ( for LINE in `paste Temp/files.txt Temp/prefixedfiles.txt` do F1=`echo $LINE | cut -f1` F2=`echo $LINE | cut -f2`  echo "ffmpeg -i $F1 -vcodec libx264 -acodec copy -threads 10 -crf 18 $F2"  done  ) > generatedscript3 

Erläuterung:

Die Export-IFS-Zeile ändert das Trennzeichen der Datei in Newline - das bedeutet, dass Leerzeichen in den Dateien korrekt behandelt werden.

Die Magie tritt in der for-LINE-Schleife auf - der Befehl "Einfügen" fügt die beiden Dateien in einer einzigen, durch Tabulatoren getrennten Ausgabe zusammen, die dann zeilenweise verarbeitet wird.

F1 und F2 trennen die beiden Teile der Eingabe in Variablen, die dann über die Echozeile gedruckt werden.

Diese gesamte Ausgabe wird in einer Datei mit dem Namen 'generatedscript3' erfasst (da sich die Schleife und das Echo in Klammern befinden).