A resposta awk
aceita por Alan é boa, mas aqui está uma solução genérica usando xargs
e bc
. A idéia é gerar uma lista de números de alguma forma, usar xargs
para uni-los em uma linha separada por espaços e usar sed
para alterar os espaços para +
caracteres ( tr
também funcionaria ). canaliza isso para bc.
O mesmo método pode ser usado para construir um regexp a partir de uma lista de strings / regexps, apenas altere os espaços para |
(regexp estendido) ou \|
(regexp básico) em vez de +
:
for i in mydoc/* ; do pdfinfo $i ; done | \
awk '/^Pages/ {print $2}' | xargs | sed -e 's/ /+/g' | bc
NOTA: se houver muitos milhares de números gerados, excedendo o limite de comprimento da linha de comando do shell, os xargs podem gerar várias linhas. Como a saída de bc
se qualifica como " gera uma lista de números de alguma forma ", a solução é canalizar a saída de bc
para xargs | sed -e 's/ /+/g' | bc
novamente.
for i in mydoc/* ; do pdfinfo $i ; done | \
awk '/^Pages/ {print $2}' | xargs | sed -e 's/ /+/g' | bc | \
xargs | sed -e 's/ /+/g' | bc
xargs | sed -e 's/ /+/g' | bc | xargs | sed -e 's/ /+/g' | bc
pode, é claro, ser colocado em um script de shell, função ou alias.
e aqui está um exemplo de como construir um regexp usando esse método. Se search.txt contiver foo, bar, baz, quux (uma palavra por linha), então:
$ cat search.txt | xargs | sed -e 's/ /|/g'
foo|bar|baz|quux
o uso inútil de gato é um marcador de lugar para este exemplo - substitua qualquer canal que gere uma lista de palavras ou padrões regulares.
Se qualquer um dos padrões de pesquisa contiver caracteres de espaço, você terá que alterá-los para outra coisa (escolha algo que provavelmente não está na entrada) temporariamente, antes de enviar para xargs
e depois alterá-los novamente após o %código%. por exemplo. se a linha 'bar' do search.txt tiver um espaço à direita:
$ cat search.txt | sed -e 's/ /XXX_SPACE_CHARACTER_XXX/g' | xargs | sed -e 's/ /|/g' -e 's/XXX_SPACE_CHARACTER_XXX/ /g'
foo|bar |baz|quux