Я хочу запустить программу, требующую разделенных запятыми массивов файлов, следующим образом:
program -input1 A.txt,B.txt,C.txt -input2 D.txt,E.txt,F.txt -out out.txt
Моя попытка bash:
Я запускаю команду из папки с именем ProgramFolder, и это папка также содержит file1.txt и file2.txt. file1.txt и file2.txt содержат имена файлов для программы, такие как:
File1:
A.txt,B.txt,C.txt
File2:
D.txt,E.txt,F.txt
Но «A.txt, B.txt, C.txt» и «D.txt, E.txt , F.txt "находятся в другой папке: source 1 и source2, как показано ниже.
## file sources
source1= ~/Band/folder1/
source2= ~/Band/folder1/
Я пытался запустить программу таким образом, но безуспешно:
program -input $source1$(cat file1.txt) -input2 $source2$(cat file2.txt) -out out.txt
Как лучше написать bash для запуска программы?
Можно использовать sed
в двух заменах команды для обработки исходных файлов, предшествующих их список в аргументах программы (благодаря steeldriver для упрощенного шаблона):
program -input "$(sed "s@^\|,@&$source1@g" file1.txt)" -input2 "$(sed "s@^\|,@&$source2@g" file2.txt)"
Я изменился sed
разделитель команд по умолчанию (/
) к @
потому что оба $source1
и $source2
расширится до пути, содержащего /
; nontheless |
необходим для чередования.
sed
разбивка команд:
s
: утверждает для выполнения замены@
: запускает шаблон^\|,
: соответствия или запуск строки или a ,
символ@
: останавливается шаблон / запускает замещающую строку&
: обратная ссылка, которая расширится до соответствия$sourceN
: расширяется до содержания $sourceN
@
: останавливается замещающая строка / запускает модификаторыg
: заменяет каждым соответствием в строкеДемонстрационный вывод sed
команды для данных значений $source1
, $source2
и для данного содержания file1.txt
и file2.txt
:
user@debian ~/tmp % echo $source1
~/Band/folder1/
user@debian ~/tmp % echo $source2
~/Band/folder2/
user@debian ~/tmp % cat file1.txt
A.txt,B.txt,C.txt
user@debian ~/tmp % cat file2.txt
D.txt,E.txt,F.txt
user@debian ~/tmp % sed "s@^\|,@&$source1@g" file1.txt
~/Band/folder1/A.txt,~/Band/folder1/B.txt,~/Band/folder1/C.txt
user@debian ~/tmp % sed "s@^\|,@&$source2@g" file2.txt
~/Band/folder2/D.txt,~/Band/folder2/E.txt,~/Band/folder2/F.txt
sudo
, тогда нет - Вы can' t игнорируют его. Ваша опция является любой выполненным сценарием как обычным пользователем (который я don' t понимают, почему Вы не делаете, с тех пор you' ре, просто создающее файл для Вашего пользователя здесь) или принадлежность файла изменения как, я показываю в своем ответе. – Sergiy Kolodyazhnyy 18 November 2016 в 20:05