Переменная эха в файл без новых строк

260
Ninsto

Я хочу избавиться от новых строк в Echo, а затем добавить к ним суффикс файла.

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 

Например, files.txt

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

Например, prefixedfiles.txt

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

Ожидаемый результат: generatescript3

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
В вашем скрипте появляются логические ошибки (удаление новых строк может быть выполнено с помощью echo -n, но я не думаю, что это поможет вам). Почему у вас есть файлы files.txt и prefixedfiles.txt, а не один файл с разделением, если требуется? Изменится ли путь в prefixedfiles.txt для файловых баз? Как вы думаете, вторая строка пытается сделать? (Я задаю эти вопросы, потому что подозреваю, что способ, которым вы пытаетесь построить сценарий, нецелесообразен - вам, вероятно, нужно перебирать $ файлы построчно. Нет смысла помогать писать его, пока я не пойму ограничения. davidgo 6 лет назад 0
1. Причина, по которой эти 2 являются отдельными, заключается в том, что для возможности добавления «-vcodec libx264 -acodec copy -threads 10 -crf 18» в середине 2 мне нужно было бы уменьшить количество символов, необходимое для каждой строки, и поместите это в середину с седом. Ninsto 6 лет назад 0
2. Да, за исключением "../Encoded" Ninsto 6 лет назад 0
3. Я предполагаю, что вы имеете в виду «sed -e 's / ^ / ffmpeg -i /' generatescript >> generatescript2», он добавляет ffmpeg -i в начало каждой строки, чтобы сообщить ffmpeg, что это входные данные. Если вы говорили о «prefixedfiles = $ (cat ./Temp/prefixedfiles.txt)», то это должна быть переменная, которую bash будет считывать, потому что cat просто выведет на новую строку. Ninsto 6 лет назад 0
Баш = эхо в 3. Ninsto 6 лет назад 0
Кстати, prefixedfiles.txt и files.txt генерируются отдельно. Я не включил весь свой сценарий, весь сценарий [здесь] (https://raw.githubusercontent.com/Ninsto/FFmpegScripts/master/copythenencode) Ninsto 6 лет назад 0

1 ответ на вопрос

0
davidgo

Что касается моих комментариев, я думаю, что логика предоставленного вами скрипта неверна - в частности, я не вижу, как sed может комбинировать 2 входных файла для каждой строки (я не думаю, что это работает так, как вы думаете оно делает)

Я придумал альтернативное решение для вас -

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

Объяснение:

Строка IFS экспорта изменяет символ разделения файлов на символ новой строки - это означает, что пробелы в файлах будут правильно обрабатываться.

Волшебство происходит в цикле for LINE - команда «paste» объединяет 2 файла в один вывод с разделением табуляцией, который затем обрабатывается построчно.

F1 и F2 разделяют 2 части ввода на переменные, которые затем печатаются с использованием линии эха.

Весь этот вывод записывается в файл с именем generatescript3 (потому что цикл и эхо находятся в скобках)

Похожие вопросы