Como cercar as entradas do xarg com mais argumentos?

1

Estou tentando usar xargs para um programa cujas saídas são as linhas

<ARG1>
<ARG2>
 ...
<ARGN>

causará a execução do seguinte comando:

command
    <GLOBAL_PREFIX_1> \
    <GLOBAL_PREFIX_2> \
    ...               \
    <PREFIX1> <PREFIX2> ... ARG1 <SUFFIX1> <SUFFIX2> ... \
    <PREFIX1> <PREFIX2> ... ARG2 <SUFFIX1> <SUFFIX2> ... \
                            ...                          \
    <PREFIX1> <PREFIX2> ... ARGN <SUFFIX1> <SUFFIX2> ... \
    <GLOBAL_SUFFIX_1> \
    <GLOBAL_SUFFIX_2> \
    ...

onde os prefixos e sufixos são conhecidos de antemão, mas arbitrários.

Algumas (provavelmente) observações óbvias que sinto que tenho que declarar de qualquer forma:

  • Os parâmetros são não "nice". Eles não possuem novas linhas, mas podem conter espaços, $ , ( , ) , " , etc.

  • Eu gostaria de evitar convertê-los em uma única string gigante e de volta, se possível.

  • Sim, eu quis dizer o que escrevi. Eu realmente apenas quero que o comando 1 seja executado: não 0, não 2, não 3, não N ...

  • Mais geralmente: eu não quero gerar um novo processo para cada argumento.

  • Ferramentas mais simples são preferidas, desde que a correção seja dada ... então xargs é preferível a sed , que é preferível a awk , etc.

  • Estou tentando usar as ferramentas shell padrão * nix aqui.
    Obviamente eu posso escrever um script Python, mas esse não é o ponto ...

por Mehrdad 28.11.2016 / 07:12

2 respostas

1

Esqueça os xargs, apenas use um loop while. Isso pressupõe que o printf esteja embutido

#!/bin/sh
printf "%s\n" "command"
printf "    %s\\n" "<GLOBAL_PREFIX_1>" "<GLOBAL_PREFIX_2>" "..."
while read -r ; do
    printf "    <PREFIX1> <PREFIX2> ... %s <SUFFIX1> <SUFFIX2> ... \\n" "$REPLY"
done
printf "    %s\\n" "<GLOBAL_SUFFIX_1>" "<GLOBAL_SUFFIX_2>"
printf "    %s\n" "..."

Se o PREFIXn ou o SUFFIXn tiverem interesting caracteres como % ou \ , eles precisarão ser escapados.

É claro que o sed funcionaria

sed '1i\
GP1\\
GP2\\
...\
s/.*/P1 P2 & S1 S2\/
$s/.*/&\
GS1\\
GS2\\
... '

Para awk você tem cláusulas BEGIN e END ....

    
por 28.11.2016 / 07:45
0

Se o prefixo arg e o postfix arg não contiverem espaço, então o GNU Parallel -X é feito para você:

seq 1000 | parallel -X echo global prefix argpre{}argpost global postfix

Ele será distribuído uniformemente para o número de núcleos. Se você não gosta disso:

seq 1000 | parallel -j1 -n10 -X echo global prefix argpre{}argpost global postfix
    
por 04.03.2017 / 12:33