читать имена файлов из файлов для командной строки

Я хочу запустить программу, требующую разделенных запятыми массивов файлов, следующим образом:

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 для запуска программы?

0
задан 27 August 2015 в 14:48

1 ответ

Можно использовать 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
3
ответ дан 28 August 2015 в 00:48
  • 1
    @Anonymous, если you' ре, выполняющее целый сценарий с sudo, тогда нет - Вы can' t игнорируют его. Ваша опция является любой выполненным сценарием как обычным пользователем (который я don' t понимают, почему Вы не делаете, с тех пор you' ре, просто создающее файл для Вашего пользователя здесь) или принадлежность файла изменения как, я показываю в своем ответе. – Sergiy Kolodyazhnyy 18 November 2016 в 20:05

Другие вопросы по тегам:

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