lê nomes de arquivo de arquivos para linha de comando

0

Eu quero executar um programa que exige matrizes de arquivos separados por vírgula da seguinte forma:

program -input1 A.txt,B.txt,C.txt -input2 D.txt,E.txt,F.txt -out out.txt

Minha tentativa de bash:

Estou executando o comando de uma pasta chamada ProgramFolder e essa pasta também contém o arquivo1.txt e o arquivo2.txt. file1.txt e file2.txt contêm nomes de arquivos para o programa, como:

File1:
A.txt,B.txt,C.txt


File2:
D.txt,E.txt,F.txt

Mas "A.txt, B.txt, C.txt" e "D.txt, E.txt, F.txt" estão em uma pasta diferente: source 1 e source2 como mostrado abaixo.

## file sources
source1= ~/Band/folder1/
source2= ~/Band/folder1/

Eu tentei executar o programa desta forma sem sucesso:

program -input $source1$(cat file1.txt) -input2 $source2$(cat file2.txt) -out out.txt

Qual é a melhor maneira de escrever um bash para executar o programa?

    
por user27976 27.08.2015 / 12:42

1 resposta

3

Você pode usar sed dentro das duas substituições de comando para processar os arquivos originais antes de sua listagem dentro dos argumentos do programa (graças ao steeldriver para o padrão simplificado):

program -input "$(sed "s@^\|,@&$source1@g" file1.txt)" -input2 "$(sed "s@^\|,@&$source2@g" file2.txt)"

Alterei o delimitador padrão dos sed commands ( / ) para @ , porque tanto $source1 como $source2 serão expandidos para um caminho que contenha / ; não é necessário | para a alternação.

% de problemas nosed:

  • s : afirma para executar uma substituição
  • @ : inicia o padrão
  • ^\|, : corresponde ao início da linha ou a , character
  • @ : interrompe o padrão / inicia a sequência de substituição
  • & : backreference que se expandirá para a correspondência
  • $sourceN : expande para o conteúdo de $sourceN
  • @ : interrompe a string de substituição / inicia os modificadores
  • g : substitui todos os jogos na linha

Exemplo de saída dos comandos sed para os valores fornecidos de $source1 , $source2 e para o conteúdo fornecido de file1.txt e 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
    
por kos 27.08.2015 / 13:45