Como passar cada linha de um arquivo como opções para um comando?

0

Eu gostaria de escrever um script que lê um arquivo e passa todas as linhas como opções (ou "argumentos de opção") para um comando, como este:

command -o "1st line" -o "2nd line" ... -o "last line" args

Qual é a maneira mais simples de fazer isso?

    
por jacek 08.11.2017 / 21:09

2 respostas

0

Aqui está uma possibilidade:

$ cat tmp
1st line
2nd line
3rd line
4th line
$ command $(sed 's|.*|-o "&"|' tmp | tr '\n' ' ')

Como Glennjackman aponta nos comentários, a divisão de palavras pode ser evitada ao se envolver em eval, embora as implicações de segurança isso deve ser apreciado:

$ eval "command $(sed 's|.*|-o "&"|' tmp | tr '\n' ' ')"

Editar: Combinar minha sugestão de usar sed para montar argumentos com a abordagem mapfile / readarray de glenn jackman fornece a seguinte forma concisa:

$ mapfile -t args < <(sed 's|.*|-o\n&|' tmp) && command "${args[@]}"

Como uma demonstração trivial, considere o arquivo tmp acima mencionado, o comando grep e o arquivo text :

$ cat text
some text 1st line and
a 2nd nonmatching line
some more text 3rd line end
$ mapfile -t args < <(sed 's|.*|-e\n&|' tmp) && grep "${args[@]}" text
some text 1st line and
some more text 3rd line end
$ printf "%s\n" "${args[@]}"
-e
1st line
-e
2nd line
-e
3rd line
-e
4th line
    
por 08.11.2017 / 21:15
5
# step 1, read the lines of the file into a shell array
mapfile -t lines < filename

# build up the command
cmd_ary=( command_name )
for elem in "${lines[@]}"; do
    cmd_ary+=( -o "$elem" )
done
cmd_ary+=( other args here )

# invoke the command
"${cmd_ary[@]}"
    
por 08.11.2017 / 21:15